Konwertuję aplikację do używania fragmentów za pomocą biblioteki kompatybilności. Obecnie mam szereg działań (ABCD), które łączą się ze sobą, D ma przycisk „OK”, który po naciśnięciu wywołania kończy się, a następnie przechodzi w pęcherzyki, onActivityResult()
aby dodatkowo zniszczyć C i B.
W mojej poprzedniej wersji fragmentu Honycomb każda czynność jest efektywnie owijaniem fragmentów Af Bf Cf Df. Wszystkie działania są uruchamiane za pośrednictwem startActivityForResult()
i onActivityResult()
wewnątrz każdego fragmentu można z radością zadzwonićgetActivity().finish()
Problem, który mam, jest w mojej wersji Plaster miodu Mam tylko jedną aktywność, A, a fragmenty Bf, Cf, Df są ładowane za pomocą FragmentManager
.
Nie rozumiem, co robić w Df po naciśnięciu „OK” w celu usunięcia fragmentów Df, Cf i Bf?
Próbowałem spowodować, że fragment sam wyskakuje ze stosu, ale spowodowało to wyjątek. onActivityResult()
jest bezużyteczny, ponieważ nie załadowałem fragmentu za pomocąstartActivityForResult()
.
Czy myślę o tym całkowicie niewłaściwie? Czy powinienem implementować jakiś detektor, który komunikuje się z fragmentem nadrzędnym lub działaniem, aby wykonać pop przy użyciu menedżera transakcji?
Odpowiedzi:
Krok # 1: Niech Df powie D: „Cześć! Mamy OK, kliknij!” poprzez wywołanie metody albo na samym działaniu, albo na instancji interfejsu dostarczonej przez działanie.
Krok # 2: Niech D. usunie fragmenty za pośrednictwem
FragmentManager
.Działalność hostingowa (D) to taka, która wie, jakie inne fragmenty znajdują się w aktywności (w porównaniu do bycia w innych działaniach). Dlatego zdarzenia wewnątrz fragmentu, które mogą wpływać na mieszankę fragmentów, powinny być propagowane do działania, które wykona odpowiednie ruchy aranżacyjne.
źródło
finish()
powinno wystarczyć.onDestroy()
metodę do swojego fragmentu i sprawdź, czy zostanie wywołany.Chociaż może to nie być najlepsze podejście, najbliższy odpowiednik, jaki mogę wymyślić, działa, to z biblioteką wsparcia / kompatybilności
lub
Inaczej.
Ponadto możesz użyć backstacka i go pop. Pamiętaj jednak, że fragment może nie znajdować się w stosie wstecznym (w zależności od transakcji, która go tam dostała ...) lub może nie być ostatnim, który dostał się na stos, więc usunięcie stosu może usunąć niewłaściwy ...
źródło
Możesz użyć poniższego podejścia, działa dobrze:
źródło
popBackStack()
to jedyne rozwiązanie, które działa, gdy chcesz usunąć tytuł paska akcji do poprzedniego stanu po usunięciu fragmentu. W przeciwnym razie nie musiałbym łączyć obu wysoko ocenianych rozwiązań z stackoverflow.com/questions/13472258/... i tego rozwiązania tutaj, aby zawsze ustawiać odpowiedni tytuł paska akcji po różnych przypadkach użycia. takie jak naciśnięcie wstecz, usuwanie, dodawanie zastępowania itd.Powinieneś pozwolić Aktywności zajmować się dodawaniem i usuwaniem Fragmentów, jak mówi CommonsWare, używaj detektora. Oto przykład:
źródło
W Activity / AppCompatActivity:
a następnie wywołaj fragment:
lub jak podano w innych odpowiedziach, nazwij to we fragmencie:
źródło
Jeśli używasz nowego komponentu nawigacyjnego, jest to proste jak
Wykona za Ciebie całą FragmentTransaction.
źródło
Sprawdź, czy Twoje potrzeby zostały zaspokojone przez DialogFragment. DialogFragment ma metodę DISISS (). Moim zdaniem znacznie czystszy.
źródło
Tworzę do tego prostą metodę
Następnie umieść go w mojej klasie ActivityUtils
Działa świetnie, baw się dobrze!
źródło
OnCreate:
W ten sposób ukrywam fragment w zdarzeniu kliknięcia 1
Następnie pokazuje to z powrotem w przypadku zdarzenia 2
źródło
Jeśli chcesz cofnąć się z czwartego fragmentu w historii plecaka do pierwszego, użyj tagów !!!
Kiedy dodajesz pierwszy fragment, powinieneś użyć czegoś takiego:
lub
A kiedy chcesz pokazać Fragmenty B, C i D, użyj tego:
i inne litery ....
Aby powrócić do
Fragment
A, po prostu zadzwońpopBackStack(0, "A")
, tak, użyj flagi podanej podczas dodawania i zwróć uwagę, że musi to być ta sama flaga w poleceniuaddToBackStack()
, a nie ta używana w poleceniu zamień lub dodaj.Nie ma za co ;)
źródło
Aby zamknąć fragment w tym samym fragmencie
źródło
Dlaczego nie tylko:
getActivity (). finish ();
źródło