Wie kann ich ein Fragment
's einstellen , Id
damit ich es verwenden kann getSupportFragmentManager().findFragmentById(R.id.--)
?
110
Wie kann ich ein Fragment
's einstellen , Id
damit ich es verwenden kann getSupportFragmentManager().findFragmentById(R.id.--)
?
Antworten:
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
FragmentTransaction
dieadd(int, Fragment)
Methode übergeben. Dies gibt jedoch nicht die ID für ein Fragment an. Es gibt die ID von aViewGroup
an, in die das eingefügtFragment
werden soll. Dies ist nicht so nützlich für den Zweck, den ich von Ihnen erwarte, da esFragment
s, aberViewGroup
s 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 vonFragment
s verwenden, müssen SieViewGroup
s für jedesFragment
eingefü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 undFragmentManager
‘ 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 .
Fragment
s muss nichtView
s haben! Sie können auch verwendet werden, um den kurzlebigen Status zwischen Konfigurationsänderungen beizubehalten!quelle
Es stellt sich heraus, dass Sie die Fragment-ID möglicherweise nicht kennen müssen.
Aus den Dokumenten:
Der wichtige Teil ist "als Container-ID beim Hinzufügen zu einer Transaktion".
so:
und dann
Sie erhalten jedes (fantastische) Fragment, das in R.id.fragment_holder enthalten ist.
quelle
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 BefehlFragmentManager.findFragmentByTag(String tab)
das betreffende Fragment suchen.quelle
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
,DialogFragment
oder plain oldFragment
(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!
quelle
Verwenden Sie Folgendes:
So fügen Sie ein Fragment hinzu:
So identifizieren Sie ein vorhandenes Fragment:
quelle
Wenn Sie ein Tag verwenden, stellen Sie bitte sicher, dass Sie das hinzufügen
Methode, damit Ihr Fragment fortgesetzt und nicht zerstört wird, wie in den Entwicklerhandbüchern erwähnt.
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 wurdequelle
Zusätzlich zu Toms Antwort unterstützt die Methode replace neben der Methode add auch das Fragment-Tag.
quelle