Während der Laufzeit
FragmentManager
kann Fragmente hinzufügen, entfernen, ersetzen und andere Aktionen mit ihnen ausführen
als Reaktion auf die Nutzerinteraktion. Jede Gruppe von Fragmenten ändert
Der Commit wird als Transaktion bezeichnet und Sie können angeben, was innerhalb
mit den von der API bereitgestellten APIs
FragmentTransaction
. Sie können mehrere Aktionen in einer Transaktion zusammenfassen, z. B.
Transaktion mehrere Fragmente hinzufügen oder ersetzen. Diese Gruppierung kann
nützlich, wenn mehrere gleichgeordnete Fragmente
Bildschirm zu wechseln, wie z. B. bei geteilten Ansichten.
Sie können jede Transaktion in einem Back-Stack speichern, der vom
FragmentManager
, wodurch der Nutzer rückwärts durch den
Fragmentänderungen – ähnlich wie das Zurücknavigieren durch Aktivitäten.
Sie können eine Instanz von FragmentTransaction
aus dem FragmentManager
abrufen.
indem Sie beginTransaction()
aufrufen, wie im folgenden Beispiel gezeigt:
Kotlin
val fragmentManager = ... val fragmentTransaction = fragmentManager.beginTransaction()
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Beim letzten Aufruf von jedem FragmentTransaction
muss die Transaktion übergeben werden.
Der commit()
-Aufruf signalisiert FragmentManager
, dass alle Vorgänge
zur Transaktion hinzugefügt wurden.
Kotlin
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit { // Add operations here }
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // Add operations here fragmentTransaction.commit();
Neuanordnung von Fragmentstatusänderungen zulassen
Für jeden FragmentTransaction
sollte setReorderingAllowed(true)
verwendet werden:
Kotlin
supportFragmentManager.commit { ... setReorderingAllowed(true) }
Java
FragmentManager fragmentManager = ... fragmentManager.beginTransaction() ... .setReorderingAllowed(true) .commit();
Aus Gründen der Verhaltenskompatibilität ist das Neuanordnungs-Flag nicht standardmäßig aktiviert.
Es ist jedoch erforderlich, damit FragmentManager
ordnungsgemäß ausgeführt werden kann.
FragmentTransaction
, insbesondere im Back-Stack
und führt Animationen und Übergänge aus. Durch Aktivieren des Flags wird sichergestellt,
mehrere Transaktionen zusammen ausgeführt werden,
zwischen liegende Fragmente,
(d.h., die hinzugefügt und dann sofort ersetzt werden)
oder ihre Animationen
oder Übergänge ausführen lassen. Beachten Sie, dass
wirkt sich diese Markierung sowohl auf die erste Ausführung der Transaktion als auch auf die Stornierung
die Transaktion mit popBackStack()
.
Fragmente hinzufügen und entfernen
Um einem FragmentManager
ein Fragment hinzuzufügen, rufen Sie
add()
für die Transaktion. Diese Methode empfängt
die ID des containers für das Fragment sowie den Klassennamen des
das Sie hinzufügen möchten. Das hinzugefügte Fragment wird in den Ordner RESUMED
verschoben
Bundesstaat. Der container sollte unbedingt ein
FragmentContainerView
der Teil der Ansichtshierarchie ist.
Um ein Fragment vom Host zu entfernen, rufen Sie
remove()
,
Übergeben einer Fragmentinstanz, die aus dem Fragment abgerufen wurde
über findFragmentById()
oder findFragmentByTag()
verwalten.
Wenn die Ansicht des Fragments zuvor einem Container hinzugefügt wurde, wird die Ansicht
aus dem Container entfernt. Das entfernte Fragment wird verschoben.
in den Status DESTROYED
geändert.
Verwenden Sie
replace()
ein vorhandenes Fragment in einem Container durch eine Instanz eines
neue Fragmentklasse, die Sie bereitstellen. Der Aufruf von replace()
entspricht
remove()
mit einem Fragment in einem Container aufrufen und ein neues
in denselben Container.
Das folgende Code-Snippet zeigt, wie Sie ein Fragment durch ein anderes ersetzen können:
Kotlin
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit { setReorderingAllowed(true) // Replace whatever is in the fragment_container view with this fragment replace<ExampleFragment>(R.id.fragment_container) }
Java
// Create new fragment and transaction FragmentManager fragmentManager = ... FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setReorderingAllowed(true); // Replace whatever is in the fragment_container view with this fragment transaction.replace(R.id.fragment_container, ExampleFragment.class, null); // Commit the transaction transaction.commit();
In diesem Beispiel wird das Fragment durch eine neue Instanz von ExampleFragment
ersetzt.
falls vorhanden, befindet sich dieser aktuell in dem Layout-Container, der durch
R.id.fragment_container
.
Standardmäßig werden die an einem FragmentTransaction
vorgenommenen Änderungen nicht zu
Back Stacks. Um diese Änderungen zu speichern, können Sie
addToBackStack()
am FragmentTransaction
. Weitere Informationen finden Sie unter
Fragmentmanager:
Commit ist asynchron
Anrufen
commit()
die Transaktion nicht sofort ausführt. Vielmehr ist die Transaktion
ausgeführt werden soll, sobald dies möglich ist. Wenn
erforderlich. Sie können jedoch
commitNow()
um die Fragmenttransaktion sofort in Ihrem UI-Thread auszuführen.
Hinweis: commitNow
ist nicht mit addToBackStack
kompatibel. Alternativ können Sie
können Sie alle ausstehenden FragmentTransactions
ausführen, die von
commit()
Aufrufe, die noch nicht durch den Aufruf von executePendingTransactions()
ausgeführt wurden. Dieser Ansatz ist mit addToBackStack
kompatibel.
Für die meisten Anwendungsfälle reicht commit()
aus.
Die Reihenfolge der Operationen ist wichtig
Die Reihenfolge, in der Sie Vorgänge innerhalb eines
FragmentTransaction
ist wichtig, insbesondere bei Verwendung von setCustomAnimations()
. Dieses
wendet die angegebenen Animationen auf alle Fragmentvorgänge an,
folgen Sie ihm.
Kotlin
supportFragmentManager.commit { setCustomAnimations(enter1, exit1, popEnter1, popExit1) add<ExampleFragment>(R.id.container) // gets the first animations setCustomAnimations(enter2, exit2, popEnter2, popExit2) add<ExampleFragment>(R.id.container) // gets the second animations }
Java
getSupportFragmentManager().beginTransaction() .setCustomAnimations(enter1, exit1, popEnter1, popExit1) .add(R.id.container, ExampleFragment.class, null) // gets the first animations .setCustomAnimations(enter2, exit2, popEnter2, popExit2) .add(R.id.container, ExampleFragment.class, null) // gets the second animations .commit()
Lebenszyklus des Fragments einschränken
FragmentTransactions
kann sich auf den Lebenszyklusstatus einer Person auswirken
Fragmente, die im Rahmen der Transaktion hinzugefügt wurden. Beim Erstellen einer
FragmentTransaction
,
setMaxLifecycle()
legt einen maximalen Status für das jeweilige Fragment fest. Beispiel:
ViewPager2
verwendet
setMaxLifecycle()
, um die nicht sichtbaren Fragmente auf den Status STARTED
zu beschränken.
Ansichten des Fragments anzeigen und ausblenden
FragmentTransaction
-Methoden verwenden
show()
und
hide()
, um die Ansicht von Fragmenten, die einem Container hinzugefügt wurden, ein- und auszublenden.
Mit diesen Methoden wird die Sichtbarkeit der Fragmentansichten ohne Auswirkung
Lebenszyklus des Fragments.
Sie müssen keine Fragmenttransaktion verwenden, um die Sichtbarkeit ein- oder auszuschalten. der Ansichten innerhalb eines Fragments sind diese Methoden nützlich, Sie möchten, dass Änderungen am Sichtbarkeitsstatus Transaktionen im Back Stack ab.
Fragmente anhängen und trennen
Die Methode FragmentTransaction
detach()
trennt das Fragment von der Benutzeroberfläche und zerstört seine Ansichtshierarchie. Das Fragment
bleibt im selben Zustand (STOPPED
), wie wenn er in den Back Stack verschoben wird.
Das bedeutet, dass das Fragment aus der Benutzeroberfläche entfernt wurde, aber weiterhin von
Fragmentmanager.
Die
attach()
-Methode ein Fragment erneut an, von dem es zuvor getrennt war.
Dadurch wird die Ansichtshierarchie neu erstellt, an die Benutzeroberfläche angehängt
und angezeigt werden.
Da ein FragmentTransaction
als ein einzelner atomarer Satz von Vorgängen behandelt wird,
Aufrufe von detach
und attach
für dieselbe Fragmentinstanz im
Transaktion sich gegenseitig abbrechen und
die Zerstörung und die sofortige
Neuerstellung der Benutzeroberfläche des Fragments. Separate
Transaktionen, getrennt durch executePendingOperations()
, wenn commit()
verwendet wird,
wenn Sie ein Fragment trennen und sofort wieder anhängen möchten.