2013-09-05 12 views
217

Jaka jest główna różnica między zawijających tych metod:Różnica między add(), replace(), a addToBackStack()

fragmentTransaction.addToBackStack(name); 
fragmentTransaction.replace(containerViewId, fragment, tag); 
fragmentTransaction.add(containerViewId, fragment, tag); 

Co to znaczy zastąpić istniejący już fragment, i dodanie fragmentu stan aktywności i dodanie aktywności do tylnego stosu?

drugie, findFragmentByTag(), czy to poszukiwanie znacznika dodano metodą add()/replace() lub metodą addToBackStack()?

Odpowiedz

252

1)fragmentTransaction.addToBackStack(str);

Opis - Dodaj tę transakcję do tyłu stosu. Oznacza to, że transakcja zostanie zapamiętana po jej zatwierdzeniu i odwróci jej działanie po późniejszym wyrzuceniu stosu.

2)fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

Opis - zastąpić istniejący fragmentu, który został dodany do pojemnika. Jest to w zasadzie to samo, co wywołanie remove (Fragment) dla wszystkich aktualnie dodanych fragmentów, które zostały dodane z tym samym containerViewId, a następnie dodane (int, Fragment, String) z tymi samymi argumentami, które podano tutaj.

3)fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

Opis - dodanie fragmentu stanu aktywności. Fragment ten 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ć istniejący już fragment, a dodając fragment do stanu aktywności i dodanie działalność na tylnym stosie?

Istnieje stos, w którym przechowywane są wszystkie czynności w stanie roboczym. Fragmenty należą do działalności. Możesz więc dodać je do osadzenia w działaniu.

Można łączyć wiele fragmentów w jedną czynność, aby utworzyć wielowpaniowy interfejs użytkownika i ponownie wykorzystać fragment w wielu działaniach. Jest to zasadniczo przydatne, gdy zdefiniowałeś swój kontener fragmentów w różnych układach. Trzeba tylko zastąpić dowolnym innym fragmentem w dowolnym układzie.

Po przejściu do bieżącego układu masz identyfikator tego kontenera, który zastąpi go żądanym fragmentem.

Możesz także powrócić do poprzedniego fragmentu w backStack metodą popBackStack(). W tym celu należy dodać ten fragment w stosie przy użyciu addToBackStack(), a następnie commit() do odzwierciedlenia. To jest w odwrotnej kolejności z aktualnym na górze.

findFragmentByTag szuka tego tagu dodawanego metodą add/replace lub addToBackStack?

Jeśli zależy od tego, w jaki sposób dodałeś tag. Następnie znajduje fragment po swoim tagu, który zdefiniowałeś wcześniej, albo po nadmuchaniu z XML, albo jako dostarczony po dodaniu w transakcji.

Referencje: FragmentTransaction

+1

dzięki za wyjaśnienie tego tak dobrze! –

+0

Czy mogę dodać fragment, zastępując metodę na początku działania? – NPE

+0

(Żaden fragment nie został dodany wcześniej) – NPE

254

Jeszcze jedna różnica między add znaczenie i replace brzmi: replace usuwa istniejący fragment i dodaje nowy fragment. Oznacza to, że po naciśnięciu przycisku "Wstecz" fragment, który został zastąpiony, zostanie utworzony z wywołanym wywołaniem onCreateView. Podczas gdy add 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", a więc po naciśnięciu przycisku WsteczCreateView nie jest wywoływany dla istniejącego fragmentu (fragment, który był tam przed nowym fragment został dodany). Jeśli chodzi o zdarzenia cyklu życia fragmentu wPause, onResume, onCreateView i inne zdarzenia cyklu życia będą wywoływane w przypadku replace, ale nie będą one wywoływane w przypadku add.

Edit: Trzeba być ostrożnym, jeśli ona jest za pomocą pewnego rodzaju biblioteki autobusowego zdarzeń jak Greenrobot's Eventbus i ponowne użycie tego samego fragmentu stos fragment na wierzchu innych poprzez add. W tym scenariuszu, mimo że postępujesz zgodnie z najlepszą praktyką i rejestrujesz magistralę zdarzeń w onResume i wyrejestrujesz w , magistrala zdarzeń będzie nadal aktywna w każdym wystąpieniu dodanego fragmentu jako fragment add nie będzie wywoływać żadnej z tych metod cyklu życia fragmentów. W rezultacie detektor magistrali zdarzeń w każdej aktywnej instancji fragmentu będzie przetwarzał to samo zdarzenie, które może nie być tym, czego potrzebujesz.

+44

+1 dla opisu busa eventbus – JohnnyLambada

+0

@JeeZ Jakie jest dobre podejście w przypadku EventBus? –

+1

Myślę, że jednym z podejść może być przetwarzanie zdarzenia w najbardziej znaczącym fragmencie i wywołanie cancelEventDelivery() po zakończeniu przetwarzania. Więcej informacji na temat metod cancelEventDelivery() można znaleźć tutaj: https://github.com/greenrobot/EventBus/blob/master/HOWTO.md#cancelling-event-delivery – JeeZ

10

Podstawową różnicą między add()replace() i może być opisany jako:

  • add() stosuje się po prostu dodanie fragmentu pewnego elementu głównego.
  • replace() zachowuje się podobnie, ale początkowo usuwa poprzednie fragmenty, a następnie dodaje następny fragment.

Możemy zobaczyć dokładną różnicę kiedy używamy addToBackStack() wraz z add() lub replace().

Kiedy naciśniemy przycisk Wstecz po w przypadku add() ... onCreateView nigdy nie jest wywoływany, ale w przypadku replace(), po naciśnięciu przycisku Wstecz ... oncreateView jest wywoływany za każdym razem.

+0

add() skutkuje większym obciążeniem pamięci android, ponieważ widok poprzedniego fragmentu nie jest zniszczony? – Derekyy

+0

@Derekyy lub możesz powiedzieć add() zachowuje stan poprzedniego fragmentu .. –

6

przykład aktywnością 2 fragmenty i używamy FragmentManager zastąpić/przyłączają addToBackstack każdego fragmentu układu aktywności

Zastosowanie wymienić

Go Fragment1

Fragment1: onCreateView 
Fragment1: onStart 
Fragment1: onResume 

Go Fragment2

Fragment1: onStop 
Fragment1: onDestroyView 
Fragment2: onCreateView 
Fragment2: onStart 
Fragment2: onResume 

Pop Fragment2

Fragment2: onStop 
Fragment2: onDestroyView 
Fragment2: onDestroy 
Fragment1: onCreateView 
Fragment1: onStart 
Fragment1: onResume 

Pop Fragment1

Fragment1: onStop 
Fragment1: onDestroyView 
Fragment1: onDestroy 

Zastosowanie dodać

Go Fragment1

Fragment1: onCreateView 
Fragment1: onStart 
Fragment1: onResume 

Go Fragment2

Fragment2: onCreateView 
Fragment2: onStart 
Fragment2: onResume 

Pop Fragment2

Fragment2: onStop 
Fragment2: onDestroyView 
Fragment2: onDestroy 

Pop Fragment1

Fragment1: onStop 
Fragment1: onDestroyView 
Fragment1: onDestroy 

Sample project

Powiązane problemy