W czasie działania aplikacji
FragmentManager
może dodawać, usuwać, zastępować i wykonywać inne działania na fragmentach
w reakcji na interakcję użytkownika. Każdy zestaw fragmentów zmienia się
zatwierdzenie jest nazywane transakcją i możesz określić, co ma się w niej dziać
transakcji za pomocą interfejsów API udostępnianych przez
FragmentTransaction
.
zajęcia. W jedną transakcję możesz zgrupować wiele działań – na przykład
transakcja może dodać lub zastąpić wiele fragmentów. Takie grupowanie może być
przydatne, gdy w
na tym samym ekranie, na przykład w przypadku podzielonego widoku.
Każdą transakcję możesz zapisać w stosie wstecznym zarządzanym przez
FragmentManager
, dzięki czemu użytkownik może przewinąć stronę
zmiany fragmentów – podobne do przechodzenia wstecz w ramach działań.
Możesz pobrać instancję FragmentTransaction
z FragmentManager
wywołując beginTransaction()
zgodnie z poniższym przykładem:
Kotlin
val fragmentManager = ... val fragmentTransaction = fragmentManager.beginTransaction()
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Ostatnie wywołanie każdego elementu FragmentTransaction
musi zatwierdzić transakcję.
Wywołanie funkcji commit()
przekazuje do FragmentManager
, że wszystkie operacje
zostały dodane do transakcji.
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();
Zezwalaj na zmianę kolejności zmian stanu fragmentu
Każdy element typu FragmentTransaction
powinien używać parametru setReorderingAllowed(true)
:
Kotlin
supportFragmentManager.commit { ... setReorderingAllowed(true) }
Java
FragmentManager fragmentManager = ... fragmentManager.beginTransaction() ... .setReorderingAllowed(true) .commit();
Aby zapewnić zgodność zachowania, flaga zmiany kolejności nie jest domyślnie włączona.
Wymagana jest jednak możliwość prawidłowego wykonania funkcji FragmentManager
FragmentTransaction
, zwłaszcza gdy działa na stosie tylnym
oraz uruchamia animacje i przejścia. Włączenie tej flagi sprawi, że jeśli
jednocześnie realizowanych jest wiele transakcji, dowolne fragmenty pośrednie
(tj.te, które zostały dodane, a następnie natychmiast zastąpione) nie są uwzględniane.
zmian cyklu życia lub ich animacje bądź przejścia. Pamiętaj, że
ta flaga wpływa zarówno na początkowe wykonanie transakcji, jak i na cofnięcie operacji
transakcję z: popBackStack()
.
Dodawanie i usuwanie fragmentów
Aby dodać fragment do elementu FragmentManager
, wywołaj
add()
.
transakcji. Ta metoda otrzymuje
identyfikator kontenera fragmentu, a także nazwa klasy klasy
fragment, który chcesz dodać. Dodany fragment zostanie przeniesiony do RESUMED
stanu. Zdecydowanie zalecamy, aby kontener był
FragmentContainerView
.
w hierarchii widoków.
Aby usunąć fragment z hosta, wywołaj
remove()
przekazywanie instancji fragmentu pobranego z fragmentu
menedżera za pomocą findFragmentById()
lub findFragmentByTag()
.
Jeśli widok fragmentu został wcześniej dodany do kontenera, zostanie on
usunięte z kontenera. Usunięty fragment jest przenoszony
do stanu DESTROYED
.
Używaj
replace()
, aby zastąpić istniejący fragment w kontenerze wystąpieniem
nowej klasy fragmentu. Wywołanie replace()
jest odpowiednikiem
wywołaj remove()
z fragmentem w kontenerze i dodaj nowy
do tego samego kontenera.
Następujący fragment kodu pokazuje, jak można zastąpić jeden fragment innym:
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();
W tym przykładzie fragment kodu ExampleFragment
zastępuje się nowym wystąpieniem
jeśli istnieje, który znajduje się obecnie w kontenerze układu wskazywanym przez
R.id.fragment_container
Domyślnie zmiany wprowadzone w FragmentTransaction
nie są dodawane do
ze stosu z tyłu. Aby zapisać te zmiany, możesz zadzwonić
addToBackStack()
– FragmentTransaction
Więcej informacji:
Menedżer fragmentów.
Zatwierdzenie jest asynchroniczne
Łączę
commit()
nie przeprowadzi transakcji od razu. Transakcja jest raczej
jest zaplanowane w głównym wątku interfejsu, gdy tylko będzie to możliwe. Jeśli
jest niezbędna, ale możesz zadzwonić
commitNow()
, aby od razu uruchomić transakcję dotyczącą fragmentu w wątku UI.
Pamiętaj, że dyrektywa commitNow
jest niezgodna z zasadą addToBackStack
. Ewentualnie
możesz wykonać wszystkie oczekujące FragmentTransactions
przesłane przez
commit()
.
niewykonanych jeszcze przez połączenie z numerem executePendingTransactions()
. Ta metoda jest zgodna z addToBackStack
.
W większości przypadków wystarczy Ci commit()
.
Kolejność operacji jest istotna
Kolejność wykonywania operacji w
FragmentTransaction
jest istotne, zwłaszcza w przypadku korzystania z setCustomAnimations()
. Ten
stosuje dane animacje do wszystkich operacji na fragmentach, które
i śledzić.
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()
Ogranicz cykl życia fragmentu
FragmentTransactions
może wpływać na stan cyklu życia danej osoby
fragmenty dodane w zakresie transakcji. Podczas tworzenia
FragmentTransaction
,
setMaxLifecycle()
.
ustawia maksymalny stan danego fragmentu. Przykład:
Aplikacja ViewPager2
używa
setMaxLifecycle()
, aby ograniczyć fragmenty poza ekranem do stanu STARTED
.
Wyświetlanie i ukrywanie widoków fragmentów
Użyj metody FragmentTransaction
show()
.
oraz
hide()
aby pokazać i ukryć widok fragmentów, które zostały dodane do kontenera.
Te metody ustawiają widoczność wyświetleń fragmentu bez wpływu
cyklu życia danego fragmentu.
Nie trzeba używać transakcji związanych z fragmentami, aby przełączać widoczność widoków w obrębie fragmentu, metody te są przydatne w przypadkach, chcesz powiązać zmiany stanu widoczności transakcji na tylnej półce.
Podłączanie i odłączanie fragmentów
Metoda FragmentTransaction
detach()
.
odłącza fragment od interfejsu użytkownika, niszcząc jego hierarchię widoków. Fragment
pozostaje w tym samym stanie (STOPPED
) co po umieszczeniu na stosie tylnym.
Oznacza to, że fragment został usunięty z interfejsu, ale nadal jest zarządzany przez
lub menedżera fragmentów.
attach()
ponownie pobiera fragment, od którego został wcześniej odłączony.
Sprawia to, że jej hierarchia widoków zostaje odtworzona, dołączona do interfejsu użytkownika
i wyświetlonych.
FragmentTransaction
jest traktowany jako pojedynczy niepodzielny zbiór operacji,
wywołania detach
i attach
w tym samym wystąpieniu fragmentu w
te same transakcje powodują anulowanie się nawzajem, dzięki czemu unikniesz
zniszczenia i natychmiastowego odtworzenia interfejsu użytkownika danego fragmentu. Użyj oddzielnego
transakcje, rozdzielone znakiem executePendingOperations()
, jeśli używasz commit()
,
jeśli chcesz odłączyć, a następnie natychmiast ponownie dołączyć fragment.