Transakcje z fragmentem kodu

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.