Fragment-Transaktionen

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.