1) fragmentTransaction.addToBackStack(str);
Beschreibung - Fügen Sie diese Transaktion dem Backstack hinzu. Dies bedeutet, dass die Transaktion nach dem Festschreiben gespeichert wird und ihren Vorgang umkehrt, wenn sie später vom Stapel entfernt wird.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Beschreibung - Ersetzen Sie ein vorhandenes Fragment, das einem Container hinzugefügt wurde. Dies entspricht im Wesentlichen dem Aufruf von remove (Fragment) für alle aktuell hinzugefügten Fragmente, die mit derselben containerViewId hinzugefügt wurden, und add (int, Fragment, String) mit denselben hier angegebenen Argumenten.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Beschreibung - Fügen Sie dem Aktivitätsstatus ein Fragment hinzu. Dieses Fragment kann optional auch seine Ansicht (wenn Fragment.onCreateView ungleich Null zurückgibt) in einer Containeransicht der Aktivität haben.
Was bedeutet es, ein bereits vorhandenes Fragment zu ersetzen, dem Aktivitätsstatus ein Fragment hinzuzufügen und dem Backstack eine Aktivität hinzuzufügen?
Es gibt einen Stapel, in dem alle Aktivitäten im laufenden Zustand gespeichert sind. Fragmente gehören zur Aktivität. Sie können sie also hinzufügen, um sie in eine Aktivität einzubetten.
Sie können mehrere Fragmente in einer einzigen Aktivität kombinieren, um eine Benutzeroberfläche mit mehreren Fenstern zu erstellen und ein Fragment in mehreren Aktivitäten wiederzuverwenden. Dies ist im Wesentlichen nützlich, wenn Sie Ihren Fragmentcontainer in verschiedenen Layouts definiert haben. Sie müssen nur durch ein anderes Fragment in einem beliebigen Layout ersetzen.
Wenn Sie zum aktuellen Layout navigieren, haben Sie die ID dieses Containers, um ihn durch das gewünschte Fragment zu ersetzen.
Sie können mit der popBackStack()
Methode auch zum vorherigen Fragment im backStack zurückkehren . Dazu müssen Sie dieses Fragment mit addToBackStack()
und dann commit()
zum Reflektieren in den Stapel einfügen. Dies erfolgt in umgekehrter Reihenfolge, wobei der Strom oben liegt.
findFragmentByTag Sucht diese Suche nach Tags, die durch die Methode add / replace oder die Methode addToBackStack hinzugefügt wurden?
Ob hängt davon ab, wie Sie das Tag hinzugefügt haben. Es findet dann nur ein Fragment anhand seines Tags, das Sie zuvor definiert haben, entweder beim Aufblasen aus XML oder wie beim Hinzufügen in einer Transaktion angegeben.
Referenzen: FragmentTransaction
Ein weiterer wichtiger Unterschied zwischen
add
undreplace
ist:replace
Entfernt das vorhandene Fragment und fügt ein neues Fragment hinzu. Dies bedeutet, dass beim Drücken der Zurück-Taste das Fragment, das ersetzt wurde, beimonCreateView
Aufrufen erstellt wird. Währendadd
die vorhandenen Fragmente beibehalten und ein neues Fragment hinzugefügt werden, bedeutet dies, dass das vorhandene Fragment aktiv ist und sich nicht im angehaltenen Zustand befindet. Wenn also eine Zurück-Taste gedrücktonCreateView
wird, wird das vorhandene Fragment (das Fragment, das vor dem neuen Fragment vorhanden war) nicht aufgerufen hinzugefügt).In Bezug auf den Lebenszyklusereignisse des Fragments
onPause
,onResume
,onCreateView
und andere Lebenszyklusereignisse werden im Fall in Anspruch genommen werden , derreplace
aber sie würde nicht bei aufgerufen werdenadd
.Bearbeiten : Man sollte vorsichtig sein, wenn sie eine Art Ereignisbusbibliothek wie Greenrobots Eventbus verwendet und dasselbe Fragment wiederverwendet, um das Fragment über andere über zu stapeln
add
. In diesem Szenario ist der Ereignisbus in jeder Instanz des hinzugefügten Fragments aktiv , obwohl Sie die bewährte Methode befolgen und den Ereignisbus registrieren und die RegistrierungonResume
aufhebenonPause
, da dasadd
Fragment keine dieser Fragmentlebenszyklusmethoden aufruft. Infolgedessen würde der Ereignisbus-Listener in jeder aktiven Instanz des Fragments dasselbe Ereignis verarbeiten, das möglicherweise nicht Ihren Wünschen entspricht.quelle
Beispiel Eine Aktivität hat 2 Fragmente und wir verwenden
FragmentManager
, um mitaddToBackstack
jedem Fragment ein Layout in Aktivität zu ersetzen / hinzuzufügenVerwenden Sie ersetzen
Gehe zu Fragment1
Gehe zu Fragment2
Pop Fragment2
Pop Fragment1
Verwenden Sie add
Gehe zu Fragment1
Gehe zu Fragment2
Pop Fragment2
Pop Fragment1
Beispielprojekt
quelle
onPause()
vorheronStop()
bei jeder Pop- Aktion aufgerufen werden ?Obwohl es sich um eine alte Frage handelt, die bereits beantwortet wurde, können diese nächsten Beispiele möglicherweise die akzeptierte Antwort ergänzen und für einige neue Programmierer in Android wie ich nützlich sein.
Option 1 - "addToBackStack ()" wird niemals verwendet
Fall 1A - Hinzufügen, Entfernen und Klicken auf die Schaltfläche Zurück
Fall 1B - Hinzufügen, Ersetzen und Klicken auf die Schaltfläche Zurück
Option 2 - "addToBackStack ()" wird immer verwendet
Fall 2A - Hinzufügen, Entfernen und Klicken auf die Schaltfläche Zurück
Fall 2B - Hinzufügen, Ersetzen, Entfernen und Klicken auf die Schaltfläche Zurück
Option 3 - "addToBackStack ()" wird nicht immer verwendet (in den folgenden Beispielen gibt w / o an, dass es nicht verwendet wird)
Fall 3A - Hinzufügen, Entfernen und Klicken auf die Schaltfläche Zurück
Fall 3B - Hinzufügen, Ersetzen, Entfernen und Klicken auf die Schaltfläche Zurück
quelle
Grundlegender Unterschied zwischen
add()
undreplace()
kann beschrieben werden als:add()
wird verwendet, um einfach ein Fragment zu einem Stammelement hinzuzufügen.replace()
verhält sich ähnlich, entfernt jedoch zuerst vorherige Fragmente und fügt dann das nächste Fragment hinzu.Wir können den genauen Unterschied sehen, wenn wir
addToBackStack()
zusammen mitadd()
oder verwendenreplace()
.Wenn wir die Zurück-Taste nach drücken , wenn
add()
... onCreateView wird nie aufgerufen, aberreplace()
wenn wir die Zurück-Taste drücken, wird oncreateView jedes Mal aufgerufen.quelle
Wenn wir das erste Fragment hinzufügen -> Zweites Fragment mit der Methode add ()
Wenn wir add () im Fragment verwenden
Wenn wir replace () im Fragment verwenden
Gehen Sie mit der Methode replace () zum ersten Fragment zum zweiten Fragment in First -> Second
Im Fall von First Fragment ersetzen wird diese Methode extra aufgerufen (onPause, onStop, onDestroyView wird extra aufgerufen)
E / Keshav FirstFragment: onPause
E / Keshav FirstFragment: onStop
E / Keshav FirstFragment: onDestroyView
quelle
Die Funktion Add and Replace des FragmentManger kann wie folgt beschrieben werden: 1. add bedeutet, dass das Fragment in den Fragment-Backstack eingefügt wird und bei einem bestimmten Frame angezeigt wird, den Sie bereitstellen
getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)
2.replace bedeutet, dass Sie das Fragment im angegebenen Frame durch ein anderes Fragment ersetzen
getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)
Das Hauptdienstprogramm zwischen den beiden besteht darin, dass beim Zurückstapeln durch Ersetzen das Fragment aktualisiert wird, durch Hinzufügen jedoch das vorherige Fragment nicht aktualisiert wird.
quelle
Wichtig zu beachten:
Der Unterschied zwischen Ersetzen und Ersetzen durch Backstack besteht immer dann, wenn wir nur Ersetzen verwenden, dann wird das Fragment zerstört (ondestroy () wird aufgerufen) und wenn wir Ersetzen mit Backstack verwenden, werden Fragmente onDestroy () nicht aufgerufen (dh wenn die Zurück-Schaltfläche gedrückt wird, wird das Fragment aufgerufen mit seinem onCreateView ())
quelle
Hier ist ein Bild, das den Unterschied zwischen
add()
und zeigtreplace()
Die
add()
Methode fügt also weiterhin Fragmente über dem vorherigen Fragment in FragmentContainer hinzu.Während
replace()
Methoden alle vorherigen Fragmente aus Containern löschen und dann in FragmentContainer hinzufügen.Was ist addToBackStack?
addtoBackStack
Methode kann mit add () und Ersetzungsmethoden verwendet werden. Es dient einem anderen Zweck in der Fragment-API.Was ist der Zweck?
Die Fragment-API wird im Gegensatz zur Aktivitäts-API standardmäßig nicht mit der Zurück-Schaltfläche-Navigation geliefert. Wenn Sie zum vorherigen Fragment zurückkehren möchten, verwenden wir die Methode addToBackStack () in Fragment. Lassen Sie uns beide verstehen
Fall 1:
Fall 2:
quelle