2014-04-10 7 views
32

Mam kod klienta. Dla wszystkich fragmentów istnieje tylko jedno działanie, tj. Pojedyncze działanie zarządza wszystkimi fragmentami.Jakie jest znaczenie metody addToBackStack z parametrem null?

Działalność ta zawiera następujący kod dla każdego fragmentu na końcu tej metody fragmentom

Na przykład - fragment MoreFragment:

MoreFragment firstFragment = new MoreFragment(); 
getSupportFragmentManager().beginTransaction() 
.replace(R.id.article_fragment, firstFragment) 
.addToBackStack(null).commit(); 

Więc

1) Czym jest znaczenie addToBackStack(null), po którym następuje commit()?

2) Dlaczego należy przekazać parametr zerowy do addToBackStack?

3) Jak zdobyć ten fragment po dodaniu w ten sposób?

Wygląda na to, że ten kod jest bezużyteczny, ponieważ uruchomiłem kod bez ostatniej linii .addToBackStack(null).commit() i działał bez żadnych problemów.

+0

http: // developer. android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String) w niektórych przypadkach musisz wywołać tę metodę. – Kedarnath

+0

http://stackoverflow.com/a/18846336/3330969 – Kedarnath

+2

Możesz przekazać nazwę fragmentu jako parametr do addToBackStack (name) zamiast Null. Jeśli przekażesz Null, nie będziesz mógł użyć metody FragmentManager.popBackStackImmediate (nazwa String, int flags); lub popBackStack (nazwa ciągu, flagi int); ponieważ nazwa miała wartość Null. Tak więc metody popBackstack nie będą działać. Proponuję przekazać nazwę fragmentu jako parametry zamiast przekazywania wartości null. – luckylukein

Odpowiedz

49

Jakie jest znaczenie metody addToBackStack (null), po której następuje commit()?

Cytowanie docs

Dzwoniąc addToBackStack(), transakcja zastąpić zostanie zapisany w powrotem stosu, dzięki czemu użytkownik może odwrócić transakcję i przywrócić poprzedni fragment naciskając przycisk Wstecz.

Jeśli dodać wiele zmian transakcji (na przykład innym add() lub usunięcia()) i nazywamy addToBackStack(), a następnie wszystkie zmiany zastosowane przed wywołaniem commit() są dodawane do tyłu stosie jako pojedyncza transakcja i przycisk Wstecz odwrócą je wszystkie razem.

kolejności, w jakiej je dodać do FragmentTransaction zmian nie ma znaczenia, z wyjątkiem:

Należy zadzwonić commit() ostatni Jeśli dodajesz wiele fragmentów do tego samego pojemnika, a następnie kolejność, w której dodaj je określa kolejność, w jakiej pojawiają się w hierarchii widoku.

Więc masz zatwierdzenie na końcu.

Dlaczego należy przekazać parametr null do addToBackStack?

Nie musi być pusta, może być ciągiem. Jeśli nie chcesz po prostu przejść zerowej

public abstract FragmentTransaction addToBackStack (String name)

Dodane w poziomie API 11 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.

Parametry nazwa Opcjonalna nazwa dla tego stanu stosu tylnego lub zerowa.

Dotyczy:

Wygląda jak ten kod jest bezużyteczny jak wpadłem kod bez ostatniego linii .addToBackStack (null) .commit() i biegła bez najmniejszych problemów

Jeśli chcesz nawigować do poprzedniego fragmentu, dodaj go do backstack. To zależy od tego, czy chcesz dodać fragment do backstack.

Jak zdobyć ten fragment po dodaniu w ten sposób?

Już masz instancję fragmentu firstFragment. Więc nie wiem co masz na myśli przez uzyskać fragment później

Więcej informacji @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)

+0

Możesz również dodać to do swojej odpowiedzi z dokumentu API: Dodaj tę transakcję do tylnego stosu. Oznacza to, że transakcja zostanie zapamiętana po jej zatwierdzeniu i odwróci jej działanie po późniejszym wyrzuceniu stosu. Parametry nazwa \t Opcjonalna nazwa dla tego stanu stosu tylnego lub zerowa. – Dyrborg

+0

Tak więc, jak zrozumiałem, cały cel dodawania do backstacku to wykonywanie nawigacji tak jak w przypadku przycisku wstecz, aby przejść do poprzedniego fragmentu? –

+1

@VedPrakash, poprawne – Kedarnath

2

Państwo odpowiedzi są przestarzałe. Jeśli nie chcesz, aby dodać do kopii fragmentów stos należy skorzystać z poniższego fragmentu kodu:

public static void replaceFragment (@NonNull FragmentManager fragmentManager, 
      @NonNull Fragment fragment,int frameId){ 

     checkNotNull(fragmentManager); 
     checkNotNull(fragment); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     transaction.replace(frameId, fragment); 
     transaction.disallowAddToBackStack(); // <-- This makes magic! 
     transaction.commit(); 
    } 

Belowe masz ładny przykład jak korzystać:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion); 
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main); 
+0

Przestarzałe gdzie?Nic nie widzę w dokumentacji ani w źródle FragmentTransaction. – Rup