1) fragmentTransaction.addToBackStack(str);
Opis - dodaj tę transakcję do tylnego stosu. Oznacza to, że transakcja zostanie zapamiętana po jej zatwierdzeniu i odwróci jej działanie, gdy później wyskoczy ze stosu.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Opis - zastąp istniejący fragment, który został dodany do kontenera. Jest to w zasadzie to samo, co wywołanie metody remove (Fragment) dla wszystkich obecnie dodanych fragmentów, które zostały dodane za pomocą tego samego kontenerViewViewId, a następnie dodania (int, Fragment, String) z tymi samymi argumentami podanymi tutaj.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Opis - Dodaj fragment do stanu aktywności. Ten fragment może opcjonalnie mieć również swój widok (jeśli Fragment.onCreateView zwraca wartość inną niż null) w widoku kontenera działania.
Co to znaczy zastąpić już istniejący fragment i dodać fragment do stanu działania i dodać działanie do tylnego stosu?
Istnieje stos, w którym przechowywane są wszystkie działania w stanie uruchomionym. Fragmenty należą do działania. Możesz więc dodać je, aby osadzić je w działaniu.
Możesz łączyć wiele fragmentów w jednym działaniu, aby zbudować wielopanelowy interfejs użytkownika i ponownie użyć fragmentu w wielu działaniach. Jest to zasadniczo przydatne, gdy zdefiniowano kontener fragmentów w różnych układach. Musisz tylko zastąpić dowolnym innym fragmentem w dowolnym układzie.
Po przejściu do bieżącego układu masz identyfikator tego kontenera, aby zastąpić go wybranym fragmentem.
Metodą możesz także wrócić do poprzedniego fragmentu backStack popBackStack()
. W tym celu należy dodać ten fragment do stosu za pomocą, addToBackStack()
a następnie commit()
do odzwierciedlenia. Jest to w odwrotnej kolejności, z prądem na górze.
findFragmentByTag czy to wyszukiwanie tagu dodanego przez metodę add / replace lub addToBackStack?
Jeśli zależy od sposobu dodania tagu. Następnie po prostu znajduje fragment według swojego tagu, który zdefiniowałeś wcześniej albo po napompowaniu z XML, albo po dostarczeniu po dodaniu w transakcji.
Odniesienia: FragmentTransaction
Jeszcze jedna ważna różnica między
add
ireplace
to:replace
usuwa istniejący fragment i dodaje nowy fragment. Oznacza to, że po naciśnięciu przycisku Wstecz zastąpiony fragment zostanie utworzony z jegoonCreateView
wywołaniem. Podczas gdyadd
zachowuje istniejące fragmenty i dodaje nowy fragment, co oznacza, że istniejący fragment będzie aktywny i nie będą one w stanie „wstrzymanym”, dlatego po naciśnięciu przycisku WsteczonCreateView
nie jest wywoływany dla istniejącego fragmentu (fragment, który był tam przed nowym fragmentem, był dodany).Jeśli chodzi o wydarzenia w cyklu życia fragment
onPause
,onResume
,onCreateView
i innych imprez cyklu życia zostanie wywołany w przypadkureplace
, ale przyzwyczajenie się powoływać w przypadkuadd
.Edycja : Należy zachować ostrożność, jeśli używa ona jakiejś biblioteki magistrali zdarzeń, takiej jak Eventbus Greenrobota i ponownie wykorzystuje ten sam fragment do układania tego fragmentu na innym za pośrednictwem
add
. W tym scenariuszu, nawet jeśli postępujesz zgodnie z najlepszymi praktykami, rejestrujeszonResume
i wyrejestrowujeszonPause
magistralę zdarzeń, magistrala zdarzeń nadal będzie aktywna w każdej instancji dodanego fragmentu, ponieważadd
fragment nie wywoła żadnej z tych metod cyklu życia fragmentu. W rezultacie detektor szyny zdarzeń w każdej aktywnej instancji fragmentu przetworzyłby to samo zdarzenie, które może nie być tym, czego chcesz.źródło
Przykład działania ma 2 fragmenty i używamy
FragmentManager
do zamiany / dodawaniaaddToBackstack
każdego fragmentu do układu w działaniuUżyj zamień
Idź Fragment 1
Przejdź fragment 2
Fragment Pop 2
Fragment popu 1
Użyj add
Idź Fragment 1
Przejdź fragment 2
Fragment Pop 2
Fragment popu 1
Przykładowy projekt
źródło
onPause()
miał być wcześniej nazywanyonStop()
przy każdej akcji Pop ?Chociaż jest to stare pytanie, na które już udzielono odpowiedzi, być może te kolejne przykłady mogą uzupełnić zaakceptowaną odpowiedź i mogą być przydatne dla niektórych nowych programistów w systemie Android, tak jak ja.
Opcja 1 - „addToBackStack ()” nigdy nie jest używane
Przypadek 1A - dodawanie, usuwanie i klikanie przycisku Wstecz
Przypadek 1B - dodawanie, zastępowanie i kliknięcie przycisku Wstecz
Opcja 2 - „addToBackStack ()” jest zawsze używana
Przypadek 2A - dodawanie, usuwanie i klikanie przycisku Wstecz
Przypadek 2B - dodawanie, zastępowanie, usuwanie i kliknięcie przycisku Wstecz
Opcja 3 - „addToBackStack ()” nie jest zawsze używane (w poniższych przykładach w / o oznacza, że nie jest używane)
Przypadek 3A - dodawanie, usuwanie i klikanie przycisku Wstecz
Przypadek 3B - dodawanie, zastępowanie, usuwanie i kliknięcie przycisku Wstecz
źródło
Podstawową różnicę między
add()
ireplace()
można opisać jako:add()
służy do zwykłego dodania fragmentu do jakiegoś elementu głównego.replace()
zachowuje się podobnie, ale najpierw usuwa poprzednie fragmenty, a następnie dodaje kolejny fragment.Dokładną różnicę widzimy, gdy używamy
addToBackStack()
razem zadd()
lubreplace()
.Kiedy naciśniemy przycisk Wstecz po w przypadku
add()
... onCreateView nigdy nie jest wywoływany, ale w przypadkureplace()
, gdy naciśniemy przycisk Wstecz ... oncreateView jest wywoływany za każdym razem.źródło
Kiedy dodajemy pierwszy fragment -> Drugi fragment za pomocą metody add ()
Kiedy używamy add () we fragmencie
Kiedy używamy replace () we fragmencie
przejście do pierwszego fragmentu do drugiego fragmentu w Pierwszym -> Drugim za pomocą metody replace ()
W przypadku zamiany pierwszego fragmentu metoda ta jest wywoływana dodatkowo (onPause, onStop, onDestroyView jest wywoływany dodatkowo)
E / Keshav FirstFragment: onPause
E / Keshav FirstFragment: onStop
E / Keshav FirstFragment: onDestroyView
źródło
Funkcja FragmentManger dodaj i zamień można opisać następująco: 1. add oznacza, że doda fragment do tylnego stosu fragmentu i pokaże w podanej ramce, którą podajesz
getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)
2.replace oznacza, że zastępujesz fragment innym fragmentem w danej ramce
getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)
Główne narzędzie między nimi polega na tym, że po ponownym ułożeniu w stos zamiennik odświeży fragment, ale dodanie nie odświeży poprzedniego fragmentu.
źródło
Ważna rzecz, na którą należy zwrócić uwagę:
Różnica między Zamień i Zamień z backstack polega na tym, że gdy używamy tylko zamiany, fragment jest niszczony (wywoływany jest ondestroy ()), a gdy używamy zamiany z backstack, wówczas fragmenty onDestroy () nie są wywoływane (tj. Po naciśnięciu przycisku Wstecz wywoływany jest fragment z jego onCreateView ())
źródło
Oto zdjęcie, które pokazuje różnicę między
add()
ireplace()
Więc
add()
metoda stale dodając fragmenty na szczycie poprzednim fragmencie w FragmentContainer.Podczas gdy
replace()
metody usuwają wszystko poprzednie fragmenty z kontenerów, a następnie dodają je do FragmentContainer.Co to jest addToBackStack
addtoBackStack
Metoda może być używana z metodami add () i replace. Służy do innego celu w Fragment API.Co jest celem?
Fragment API w przeciwieństwie do API aktywności nie jest domyślnie wyposażony w nawigację z przyciskiem Wstecz . Jeśli chcesz wrócić do poprzedniego fragmentu, używamy metody addToBackStack () we fragmencie. Rozumiem oba
Przypadek 1:
Przypadek 2:
źródło