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
die add(int, Fragment)
Methode übergeben. Dies gibt jedoch nicht die ID für ein Fragment an. Es gibt die ID von a ViewGroup
an, in die das eingefügt Fragment
werden soll. Dies ist nicht so nützlich für den Zweck, den ich von Ihnen erwarte, da es Fragment
s, aber ViewGroup
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 von Fragment
s verwenden, müssen Sie ViewGroup
s für jedes Fragment
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 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 . Fragment
s muss nicht View
s haben! Sie können auch verwendet werden, um den kurzlebigen Status zwischen Konfigurationsänderungen beizubehalten!
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.
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.
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 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!
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);
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