tl; dr: poprawnym sposobem zamknięcia a DialogFragment
jest użycie dismiss()
bezpośrednio w DialogFragment .
Szczegóły : dokumentacja stanów DialogFragment
Sterowanie oknem dialogowym (decydowanie, kiedy je pokazać, ukryć, zamknąć) powinno odbywać się za pośrednictwem interfejsu API tutaj, a nie za pomocą bezpośrednich wywołań w oknie dialogowym.
Dlatego nie powinieneś używać getDialog().dismiss()
, ponieważ wywołałoby dismiss()
to okno dialogowe . Zamiast tego należy użyć samej dismiss()
metody DialogFragment:
publiczne void odrzucić ()
Odrzuć fragment i jego dialog. Jeśli fragment został dodany do tylnego stosu, wszystkie stany tylnego stosu do tego wpisu włącznie zostaną usunięte. W przeciwnym razie zostanie zatwierdzona nowa transakcja w celu usunięcia fragmentu.
Jak widać, zajmuje się to nie tylko zamknięciem okna dialogowego, ale także obsługą transakcji fragmentowych zaangażowanych w proces.
Musisz użyć tylko onStop
wtedy, gdy jawnie utworzyłeś jakiekolwiek zasoby, które wymagają ręcznego czyszczenia (zamykanie plików, zamykanie kursorów itp.). Nawet wtedy zastąpiłbym onStop
DialogFragment zamiast onStop
podstawowego Dialog.
protected void showDialogFragment(final DialogFragment fragment) {final FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction(); fTransaction.addToBackStack(null); fragment.show(fTransaction, "dialog");}
Przepraszam za paskudną jedną wkładkę! Ale tak, możesz mieć rację, więc na razie napisałem inny sposób na zamknięcie moich DialogFragments. Sposób, w jaki je odrzucałem za pomocą metody dismiss (), polegał na znalezieniu fragmentu po tagu, a następnie uruchomieniu na nim disciss (), jeśli nie był pusty. Aha i tak,new
umieszczam fragment tuż przed przekazaniem go do tej metody.Myślę, że lepszym sposobem na zamknięcie
DialogFragment
jest:W ten sposób nie musisz mieć odniesienia do pliku
DialogFragment
i możesz go zamknąć z dowolnego miejsca.źródło
Dlaczego nie spróbujesz użyć tylko tego kodu:
Jeśli chcesz samodzielnie odrzucić fragment okna dialogowego. Możesz po prostu umieścić ten kod wewnątrz fragmentu okna dialogowego, w którym chcesz zamknąć okno dialogowe.
Na przykład:
Spowoduje to zamknięcie ostatniego fragmentu okna dialogowego, który jest wyświetlany na ekranie.
Mam nadzieję, że to pomoże.
źródło
Głosowałem za odpowiedzią Terela. Chciałem tylko opublikować to dla wszystkich użytkowników Kotlin:
źródło
Odpowiedź Kotlin Version of Terel
źródło
Należy odrzucić cię
Dialog
wonPause()
tak zastąpić.Również przed zamknięciem możesz sprawdzić
null
i wyświetla się jak poniżej fragment:źródło
DialogFragment
Google w ogóle nie pokazujeonPause()
używanej metody. Ale myślę, że rozumiem, co robisz. O co chodzi, jeśli użytkownik nie dzwonionPause()
. To wtedy, gdy system wie, że fragment jest wywoływany. A kiedy, powiedzmy, że użytkownik anuluje subskrypcję. Jaki jest lepszy sposób na zamknięcie tego w takim przypadku?W innych odpowiedziach znajdują się odniesienia do oficjalnych dokumentów ( DialogFragment Reference ), ale nie ma wzmianki o podanym tam przykładzie:
Na moje potrzeby zmieniłem to na:
źródło
Dodanie do innych odpowiedzi, gdy
DialogFragment
wywołanie jest pełnoekranowedismiss()
, nie spowoduje wyskoczenia DialogFragment z zaplecza fragmentu. Sposób obejścia problemu polega na wywołaniuonBackPressed()
działania rodzica.Coś takiego:
CustomDialogFragment.kt
źródło
Po prostu wywołaj odrzucenie () z fragmentu, który chcesz odrzucić.
źródło
Zauważyłem, że gdy mój fragment został zdefiniowany na wykresie nawigacyjnym za pomocą
<fragment>
tagu (dla pełnoekranowego fragmentu dialogowego), fragment okna dialogowego nie został usunięty za pomocądismiss()
polecenia. Zamiast tego musiałem zdjąć tylny stos:Jeśli jednak ten sam fragment okna dialogowego został zdefiniowany na wykresie nawigacyjnym ze
<dialog>
znacznikiem,dismiss()
działa dobrze.źródło
źródło