2012-06-26 15 views
79

Docs powiedzieć to dla metody z klasy Dialogdismiss():Jak poprawnie odrzucić DialogFragment?

Dismiss this dialog, removing it from the screen. This method can be invoked 
safely from any thread. Note that you should not override this method to do 
cleanup when the dialog is dismissed, instead implement that in onStop(). 

W moim kodu, wszystko co robię jest wywołanie getDialog().dismiss() aby ją odrzucić. Ale nie robię nic innego ani nawet nie używam onStop(). Pytam więc dokładnie, jak prawidłowo odwołać DialogFragment aby uniknąć wycieków pamięci, etc ..

Odpowiedz

136

tl; dr: Poprawny sposób, aby zamknąć DialogFragment jest użycie dismiss()bezpośrednio na DialogFragment.


Szczegóły: The documentation of DialogFragment stany

Kontrola okna (decydując kiedy pokazać, ukryć, zwalnia go) powinno odbywać się za pośrednictwem interfejsu API tutaj, a nie z bezpośrednich połączeń w oknie dialogowym .

Zatem nie powinno się używać getDialog().dismiss(), ponieważ byłoby powołać dismiss()na dialogowego. Zamiast tego należy użyć metody dismiss() samego DialogFragment:

public void odrzucenie()

Odrzuć fragmentu i jego okno. Jeśli fragment został dodany do tylnego stosu, stan wszystkich stosów do tego wpisu zostanie włączony. W przeciwnym razie nowa transakcja będzie zobowiązana do usunięcia fragmentu.

Jak widać, dba to nie tylko o zamknięcie okna dialogowego, ale także o obsługę transakcji fragmentacji związanych z procesem.

Należy użyć tylko onStop, jeśli jawnie utworzono zasoby wymagające ręcznego czyszczenia (zamykanie plików, zamykanie kursorów itp.). Nawet wtedy przesłoniłbym onStop DialogFragment zamiast onStop z bazowego okna dialogowego.

+4

Niestety to powoduje, że moja czynność zawierająca kończy się ... –

+0

@ScootrNova: Nie powinno, prawdopodobnie masz błąd w innym miejscu. Jak tworzysz fragment? – Heinzi

+0

'protected void showDialogFragment (ostatni fragment DialogFragment) {final FragmentTransaction fTransaction = getSupportFragmentManager(). BeginTransaction(); fTransaction.addToBackStack (null); fragment.show (fTransaction, "dialog");} ' Przepraszam za paskudny jeden liniowiec! Ale tak, możesz mieć rację, więc na razie napisałem inny sposób na zamknięcie moich DialogFragmentów. Sposób, w jaki ich odwoływałem za pomocą metody dismiss(), polegał na znalezieniu fragmentu według znacznika, a następnie uruchomieniu metody dismiss(), jeśli nie było wartości NULL. Och i tak, jestem "nowy" fragment tuż przed przekazaniem go do tej metody. –

0

Należy odrzucić Ci Dialog w onPause() więc zastąpić go.

także przed odrzuceniem można sprawdzić null i pokazuje jak poniżej fragment kodu:

@Override 
protected void onPause() { 
    super.onPause(); 
    if (dialog != null && dialog.isShowing()) { 
     dialog.dismiss(); 
    } 
} 
+0

napisał już, że robi to dismiss() i jego dotyczy DialogFragment. –

+0

Myślę, że działa to zarówno dla Dialog i DialogFragments @PareshMayani – Venky

+2

Wierzę, że @PareshMayani jest poprawny Venky. Samouczek dotyczący 'DialogFragment' autorstwa google nie pokazuje w ogóle użytej metody' onPause() '. Ale myślę, że widzę, co robisz. Co jednak, jeśli użytkownik nie wywołuje 'onPause()'. To wtedy, gdy system wie, że fragment jest wywoływany. A co powiesz na pytanie, kiedy użytkownik anuluje. Co jest lepszym sposobem, aby to zamknąć w tej sprawie? – Andy

48

myślę lepszy sposób na zamknięciu DialogFragment to:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog"); 
    if (prev != null) { 
     DialogFragment df = (DialogFragment) prev; 
     df.dismiss(); 
    } 

W ten sposób nie trzeba posiadać odniesienie do DialogFragment i może zamknąć go zewsząd.