Przeniesiłem moją aplikację na Androida do plastra miodu i zrobiłem duży refaktor, aby użyć fragmentów. W mojej poprzedniej wersji, kiedy nacisnąłem przycisk Home, robiłem a ACTIVITY_CLEAR_TOP
, aby zresetować tylny stos.
Teraz moja aplikacja to tylko jedno działanie z wieloma fragmentami, więc po naciśnięciu przycisku Początek po prostu zastępuję jeden z zawartych w nim fragmentów. Jak mogę usunąć moje plecy stos bez konieczności korzystania startActivity
z ACTIVITY_CLEAR_TOP
flag?
android
android-fragments
biquillo
źródło
źródło
Odpowiedzi:
Opublikowałem tutaj coś podobnego
Z odpowiedzi Joachima, Dianne Hackborn:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
Skończyło się na tym, że użyłem:
Ale równie dobrze mógł użyć czegoś takiego:
Który wyskoczy wszystkie stany do podanego. Następnie możesz po prostu zastąpić fragment tym, co chcesz
źródło
Aby udzielić odpowiedzi na komentarz @ Warpzit i ułatwić innym znalezienie.
Posługiwać się:
źródło
Z całym szacunkiem dla wszystkich zaangażowanych stron; Jestem bardzo zaskoczony, widząc, jak wielu z was może wyczyścić cały stos za pomocą prostego
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Zgodnie z dokumentacją Androida (w odniesieniu do
name
argumentu - „zero” w zastrzeżonych propozycjach roboczych).Teraz zdaję sobie sprawę, że brakuje mi wiedzy o twoich konkretnych implementacjach (np. Ile wpisów masz na tylnym stosie w danym momencie), ale postawiłbym wszystkie moje pieniądze na przyjętą odpowiedź, oczekując dobrze zdefiniowanej odpowiedzi zachowanie w szerszym zakresie urządzeń i dostawców:
(dla porównania, coś z tym)
źródło
Działa dla mnie w prosty sposób bez użycia pętli:
źródło
Zaakceptowana odpowiedź nie była dla mnie wystarczająca. Musiałem użyć:
źródło
popBackStackImmediate()
transakcja jest przeprowadzana synchronicznie, co na ogół jest odradzane.Wyczyść backstack bez pętli
Gdzie nazwa jest parametrem addToBackStack ()
źródło
Chciałem tylko dodać:
Wyskakujące ze stosu za pomocą następujących
chodzi tylko o usunięcie fragmentów z transakcji, w żaden sposób nie usunie tego fragmentu z ekranu. Idealnie więc może nie być dla ciebie widoczny, ale mogą znajdować się dwa lub trzy fragmenty ułożone jeden na drugim, a po naciśnięciu klawisza wstecz interfejs użytkownika może wyglądać na zagracony, ułożony w stos.
Biorąc prosty przykład: -
Załóżmy, że masz fragment A, który ładuje Fragmnet B za pomocą fragmentmanager.replace (), a następnie dodajemyToBackStack, aby zapisać tę transakcję. Więc przepływ jest:
KROK 1 -> Fragment A-> Fragment B (przenieśliśmy się do Fragmentu B, ale Fragment A jest w tle, niewidoczny).
Teraz wykonujesz trochę pracy we fragmencie B i naciskasz przycisk Zapisz - który po zapisaniu powinien wrócić do fragmentu A.
KROK 2-> Po zapisaniu Fragmentu B wracamy do Fragmentu A.
KROK 3 -> Tak częstym błędem byłoby ... we fragmencie B, zrobimy fragment Manager.replace () fragmentB z fragmentem A.
Ale to, co się faktycznie dzieje, ponownie ładujemy Fragment A, zastępując Fragment B. Więc teraz są dwa FragmentA (jeden ze STEP-1 i jeden z tego STEP-3).
Dwa wystąpienia Fragmentów A są ułożone jeden na drugim, co może nie być widoczne, ale już tam jest.
Więc nawet jeśli wyczyścimy backstack powyższymi metodami, transakcja zostanie wyczyszczona, ale nie rzeczywiste fragmenty. Idealnie więc w takim szczególnym przypadku po naciśnięciu przycisku Zapisz wystarczy wrócić do fragmentu A, wykonując po prostu fm.popBackStack () lub fm.popBackImmediate () .
Więc popraw Step3-> fm.popBackStack () wróć do fragmentu A, który jest już w pamięci.
źródło
Czytając dokumentację i badając identyfikator fragmentu, wydaje się, że jest to po prostu indeks stosu, więc działa to:
Zero (
0
) jest dolną częścią stosu, więc pojawienie się na nim łącznie usuwa stos.CAVEAT: Chociaż powyższe działa w moim programie, waham się trochę, ponieważ dokumentacja FragmentManager nigdy tak naprawdę nie stwierdza, że id jest indeksem stosu. Ma to sens, a wszystkie moje dzienniki debugowania odsłaniają, że tak jest, ale być może w szczególnych okolicznościach tak się nie stanie? Czy ktoś może to potwierdzić w ten czy inny sposób? Jeśli tak, to powyższe jest najlepszym rozwiązaniem. Jeśli nie, jest to alternatywa:
źródło
fragmentManager..getBackStackEntryAt(0).getId()
zamiast 0? Powinno to działać, nawet jeśli identyfikatory pozycji backstack są w pewnym momencie inne niż indeks stosu.Stosowanie
źródło
Cześć ~ Znalazłem rozwiązanie, które jest znacznie lepsze, od: https://gist.github.com/ikew0ng/8297033
źródło
Mam to działające w ten sposób:
źródło
Działa dla mnie, spróbuj tego:
źródło
Wywołanie tej metody byłoby bardzo miłe.
źródło
źródło