Android - Fragment-ID festlegen

110

Wie kann ich ein Fragment's einstellen , Iddamit ich es verwenden kann getSupportFragmentManager().findFragmentById(R.id.--)?

tyb
quelle
Sie können es in Layout-XML-Datei
einstellen

Antworten:

116

Sie können die ID eines Fragments nicht programmgesteuert festlegen .

Es gibt jedoch eine String tag, die Sie in der FragmentTransaction festlegen können, um ein Fragment eindeutig zu identifizieren.

Wie Aleksey betonte, können Sie eine ID an FragmentTransactiondie add(int, Fragment)Methode übergeben. Dies gibt jedoch nicht die ID für ein Fragment an. Es gibt die ID von a ViewGroupan, in die das eingefügt Fragmentwerden soll. Dies ist nicht so nützlich für den Zweck, den ich von Ihnen erwarte, da es Fragments, aber ViewGroups nicht eindeutig identifiziert . Diese IDs bestehen aus Containern , denen ein oder mehrere Fragmente dynamisch hinzugefügt werden können. Wenn Sie eine solche Methode zur Identifizierung von Fragments verwenden, müssen Sie ViewGroups für jedes Fragmenteingefügte Element dynamisch zum Layout hinzufügen . Das wäre ziemlich umständlich.

Also , wenn Sie Ihre Frage ist , wie eine eindeutige Kennung erstellen für ein Fragment Sie hinzufügen dynamisch, ist die Antwort verwenden FragmentTransaction‚s add (int containerViewId, Fragment Fragment, String - Tag) Methode und FragmentManager‘ s findFragmentByTag (String) Methode.

In einer meiner Apps musste ich Zeichenfolgen dynamisch generieren. Aber es ist sowieso nicht so teuer im Vergleich zur eigentlichen FragmentTransaction.

Ein weiterer Vorteil der Tag-Methode besteht darin, dass sie ein Fragment identifizieren kann, das nicht zur Benutzeroberfläche hinzugefügt wird. Siehe die add (Fragment, String) -Methode von FragmentTransaction . Fragments muss nicht Views haben! Sie können auch verwendet werden, um den kurzlebigen Status zwischen Konfigurationsänderungen beizubehalten!

Thomas Dignan
quelle
Wenn ich das Tag und nicht die ID für das Fragment verwende, wie würde ich den Ersetzungsaufruf verwenden, für den eine Fragmentressourcen-ID erforderlich ist?
Namratha
12
@ TomDignan Wie wäre es mit einem Fragment, das in einem ViewPager hinzugefügt wird? Wie kann ich sein Tag setzen? In dieser Situation kann ich keine Transaktionen verwenden.
GuilhE
1
@ GuilhE Activity bietet eine addFragment () -Methode, auf die Sie im Viewpager verweisen können. Das Tag vorher zu behalten, könnte mit einer Hashmap erreicht werden.
Thomas Dignan
1
Kann die Antwort ein wenig bearbeitet werden, um zu betonen, dass Sie die ID im XML-Layout festlegen können? Weil ich persönlich keine anderen Fragen gelesen habe und den Eindruck hatte, dass es überhaupt keine Möglichkeit gibt, die ID für das Fragment
Ivan
41

Es stellt sich heraus, dass Sie die Fragment-ID möglicherweise nicht kennen müssen.

Aus den Dokumenten:

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

Der wichtige Teil ist "als Container-ID beim Hinzufügen zu einer Transaktion".

so:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

und dann

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

Sie erhalten jedes (fantastische) Fragment, das in R.id.fragment_holder enthalten ist.

Elchmoral
quelle
4

In den meisten Fällen können Sie sowohl das Fragment-Tag als auch die ID verwenden.
Sie können den Tag-Wert in festlegen FragmentTransaction.add(Fragment fragment, String tag );. Anschließend können Sie mit dem Befehl FragmentManager.findFragmentByTag(String tab)das betreffende Fragment suchen.

user2014118
quelle
2

Wie Tom und andere bereits erwähnen, gibt es Möglichkeiten, ein Tag mit einem Tag zu versehen und dieses Tag zur Identifizierung zu verwenden. Ein nachfolgendes Problem, auf das ich bei diesen Lösungen gestoßen bin, ist, dass das Fragment erst dann ein Tag erhält, wenn es mit der Aktivität (oder tatsächlich mit der FragmentManager) verknüpft ist . Was tun, wenn ein Fragment identifiziert werden muss, bevor es markiert wurde?

Meine bisherigen Lösungen basieren alle auf dem ältesten (Java) Trick der Welt: Erstellen Sie ein minimalistisches Vorlagenfragment, das eine ID in einem seiner Konstruktoren verwendet und eine getFragmentId()Methode bereitstellt , die diese ID zurückgibt. Ich lasse dann die Fragmente, die frühzeitig identifiziert werden müssen, diese Vorlage erweitern und; voila! Problem gelöst.

Diese Lösung könnte, erfordert leider einen Satz von Vorlagen Fragmenten, eines für jeden Fragmenttyp ListFragment, DialogFragmentoder plain old Fragment(POFO ?!) , die frühe Identifizierung benötigen. Dies ist jedoch bei Fragmenten, von denen ich denke, dass sie angesichts der erzielten Gewinne beherrschbar sind, überschaubar.

Tut mir leid, dass ich heilende Wunden aufgerissen habe :-)

Prost!

dbm
quelle
0

Verwenden Sie Folgendes:

So fügen Sie ein Fragment hinzu:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

So identifizieren Sie ein vorhandenes Fragment:

getFragmentManager().findFragmentByTag(fragmentName);
Jaydev
quelle
Die Antwort ist für die Frage nicht relevant. Bitte aktualisieren Sie die Antwort. Happy Coding
CodeWithVikas
-1

Wenn Sie ein Tag verwenden, stellen Sie bitte sicher, dass Sie das hinzufügen

fragmentTransaction.addToBackStack(null); 

Methode, damit Ihr Fragment fortgesetzt und nicht zerstört wird, wie in den Entwicklerhandbüchern erwähnt.

Wenn Sie addToBackStack () nicht aufrufen, wenn Sie eine Transaktion ausführen, bei der ein Fragment entfernt wird, wird dieses Fragment zerstört, wenn die Transaktion festgeschrieben wird und der Benutzer nicht zurück navigieren kann. Wenn Sie dagegen beim Entfernen eines Fragments addToBackStack () aufrufen, wird das Fragment gestoppt und später fortgesetzt, wenn der Benutzer zurück navigiert.

Sie finden dies am Ende dieser Seite .

Ich habe ungefähr 30 Minuten verloren, um herauszufinden, warum mein Fragment nicht durch einen einfachen findFragmentByTag();Anruf gefunden wurde

Panos Gr
quelle
-2

Zusätzlich zu Toms Antwort unterstützt die Methode replace neben der Methode add auch das Fragment-Tag.

oren zvi
quelle