Jakie jest znaczenie addToBackStack z parametrem null?

97

Mam kod klienta. Dla wszystkich fragmentów jest tylko jedno działanie, tj. Pojedyncza aktywność polega na zarządzaniu wszystkimi fragmentami.

Ta aktywność zawiera następujący kod dla dowolnego fragmentu na końcu metody tego fragmentu

Na przykład - fragment MoreFragment:

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

Więc,

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

2) Dlaczego musisz 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.

Mój Boże
źródło
developer.android.com/reference/android/app/ ... w niektórych przypadkach musisz wywołać tę metodę.
Lucifer,
3
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 ciągu, flagi int); lub popBackStack (nazwa ciągu, flagi int); ponieważ nazwa brzmiała Null. Więc metody popBackstack nie będą działać. Proponuję przekazać nazwę fragmentu jako parametry zamiast przekazywać wartość null.
luckylukein

Odpowiedzi:

114

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

Cytowanie dokumentów:

Wywołując addToBackStack (), transakcja zamiany jest zapisywana na stosie tylnym, aby użytkownik mógł cofnąć transakcję i przywrócić poprzedni fragment, naciskając przycisk Wstecz.

Jeśli dodasz wiele zmian do transakcji (takich jak kolejna add () lub remove ()) i wywołasz addToBackStack (), wszystkie zmiany zastosowane przed wywołaniem commit () zostaną dodane do stosu wstecznego jako pojedyncza transakcja i przycisk Wstecz odwróci je wszystkie razem.

Kolejność, w jakiej dodajesz zmiany do FragmentTransaction, nie ma znaczenia, z wyjątkiem:

Musisz zadzwonić commit() ostatni. Jeśli dodajesz wiele fragmentów do tego samego kontenera, kolejność ich dodawania określa kolejność ich wyświetlania w hierarchii widoków.

Więc musisz się zobowiązać w końcu.

Dlaczego musisz przekazać parametr o wartości null, aby addToBackStack?

Nie musi to być null, może to być ciąg. Jeśli nie chcesz, po prostu podaj null.

public abstract FragmentTransaction addToBackStack (nazwa ciągu)

Dodano na poziomie API 11 Dodaj tę transakcję do stosu tylnego. Oznacza to, że transakcja zostanie zapamiętana po jej zatwierdzeniu i odwróci swoją operację, gdy zostanie później zdjęta ze stosu.

Nazwa parametrów Opcjonalna nazwa tego stanu stosu tylnego lub null.

O:

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

Jeśli chcesz przejść do poprzedniego fragmentu, dodaj go do stosu. Zależy to więc od tego, czy chcesz dodać fragment do stosu.

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

Masz już instancję fragmentu firstFragment. Więc nie wiem, co masz na myśli, mówiąc o zdobyciu fragmentu 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)

Raghunandan
źródło
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 swoją operację, gdy zostanie później zdjęta ze stosu. Nazwa parametrów Opcjonalna nazwa tego stanu stosu tylnego lub null.
Dyrborg,
Więc jak zrozumiałem, cały cel dodawania do backstacka ma na celu wykonanie nawigacji tak, jak robimy z przyciskiem wstecz, aby przejść do poprzedniego fragmentu?
Mój Boże,
ok, więc jeśli przekazujesz parametr do addToBackStack, to dlaczego musimy to zrobić, getFragmentManager().popBackStackImmediate()jeśli przycisk Wstecz może to zrobić samodzielnie z / bez podania parametru? Zobacz odpowiedź - stackoverflow.com/questions/21156153/…
My God
@VedPrakash, którego nie musisz mieć. To także zupełnie inne pytanie i odpowiedź. Możesz łatwo się o tym przekonać, dodając dwa fragmenty do tylnego stosu i naciskając przycisk Wstecz
Raghunandan
@VedPrakash przeczytaj zarządzanie fragmentami @ developer.android.com/guide/components/fragments.html
Raghunandan
17

tagCiąg w addToBackStack(String name)daje sposób znaleźć stos z powrotem na później pop bezpośrednio do tej lokalizacji. Miał być użyty w metodzie popToBackStack(String name, int flags):

Zdejmij ostatnie przejście fragmentu z tylnego stosu fragmentów menedżera. Ta funkcja jest asynchroniczna - kolejkuje żądanie do pop, ale akcja nie zostanie wykonana, dopóki aplikacja nie powróci do pętli zdarzeń.

nazwa: Jeśli nie jest pusta, jest to nazwa poprzedniego stanu, którego należy szukać; jeśli zostanie znaleziony, wszystkie stany do tego stanu zostaną usunięte. Flaga POP_BACK_STACK_INCLUSIVE może służyć do kontrolowania, czy sam nazwany stan jest otwierany. Jeśli null, tylko najwyższy stan jest usuwany.

flagi: 0 lub POP_BACK_STACK_INCLUSIVE.

Innymi słowy, będzie przesuwał twój tylny stos, dopóki nie znajdzie fragmentu, który został dodany przez nameinaddToBackStack(String name) .

Na przykład, jeśli wykonasz serię dodatków lub zastąpisz menedżera fragmentów, podając nazwy „frag1”, „frag2”, „frag3”, „frag4”, a później chcesz wrócić bezpośrednio do fragmentu 2 dodanego za pomocą addToBackStack („ frag2 ”), dzwonisz popToBackStack("frag2", 0).

Więc,

  • Użyj .addToBackStack("fragName"): jeśli chcesz później popToBackStack(String name, int flags)zdjąć więcej niż jeden tylny stos.

  • Użyj .addToBackStack(null): Jeśli nie chcesz później zdejmować więcej niż jednego tylnego stosu, ale nadal chcesz zdejmować jeden na raz. Zrób to nawet, jeśli nie będziesz jawnie wywoływał popToBackStack (), ale zamiast tego pozwolisz domyślnej implementacji klawisza wstecznego na obsługę stosu wstecznego.

  • Użycie .disallowAddToBackStack(): Jeśli nie chcesz, aby naciśnij wstecz lub wywołaj popBackStack () jawnie. Zapewni to, że żadna część kodu nie używa .addToBackStack ().

Allan Veloso
źródło
1

Twoje odpowiedzi są przestarzałe. Jeśli nie chcesz dodawać fragmentów do tylnego stosu, użyj 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();
    }

Poniżej masz ładny przykład, jak go używać:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
Eliasz Kubala
źródło
6
Przestarzałe, gdzie? Nie widzę niczego w dokumentacji ani w źródle FragmentTransaction.
Rup
3
Uważaj, jeśli tak disallowAddToBackStack, to wszelkie przyszłe wywołania addToBackStack rzucą wyjątek IllegalStateException. Jeśli metoda addToBackStack została już wywołana, ta metoda zgłosi wyjątek IllegalStateException.
Kathir,