2012-06-26 19 views
79

La documentazione dicono che questo per il metodo dismiss() dalla classe Dialog:Come chiudere correttamente un 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(). 

Nel mio codice, non faccio altro che chiamata getDialog().dismiss() di respingerlo. Ma non sto facendo nient'altro e nemmeno usando onStop(). Quindi sto chiedendo esattamente come respingere correttamente uno DialogFragment per evitare perdite di memoria, ecc.

risposta

136

tl; dr: Il modo corretto per chiudere un DialogFragment è quello di utilizzare dismiss()direttamente sul DialogFragment.


dettagli: I documentation of DialogFragment stati

controllo della finestra di dialogo (decidere quando per mostrare, nascondere, respingerlo) dovrebbe essere fatto tramite l'API qui, non con chiamate dirette nella finestra .

Quindi, non si dovrebbe usare getDialog().dismiss(), dal momento che sarebbe richiamare dismiss()nella finestra di dialogo. Invece, si dovrebbe utilizzare il metodo dismiss() del DialogFragment stesso:

public void respingere()

Respingere il frammento e la sua finestra. Se il frammento è stato aggiunto allo stack posteriore, tutto lo stato dello stack posteriore fino a includere questa voce verrà spuntato. In caso contrario, verrà impegnata una nuova transazione per rimuovere il frammento.

Come si può vedere, questo si occupa non solo della chiusura del dialogo ma anche della gestione delle transazioni frammentate coinvolte nel processo.

È necessario utilizzare solo onStop se si creano esplicitamente risorse che richiedono la pulizia manuale (chiusura di file, chiusura di cursori, ecc.). Anche in questo caso, ignorare onStop di DialogFragment anziché onStop della finestra di dialogo sottostante.

+4

Sfortunatamente questo sta causando il completamento del mio Activity contenente ... –

+0

@ScootrNova: Non dovrebbe, probabilmente hai un bug altrove. Come stai creando il frammento? – Heinzi

+0

'protected protected showDialogFragment (frammento finale DialogFragment) {final FragmentTransaction fTransaction = getSupportFragmentManager(). BeginTransaction(); fTransaction.addToBackStack (null); fragment.show (fTransaction, "dialog");} Ci scusiamo per il cattivo rivestimento! Ma si potrebbe aver ragione, quindi per il momento ho scritto un altro modo per chiudere il mio DialogFragments. Il modo in cui li stavo licenziando usando il metodo dismiss() stava solo trovando il frammento per tag e poi eseguendo il comando dismiss() su di esso se non era nullo. Oh e sì, sto 'new'ing il frammento prima di passarlo a quel metodo. –

0

Si consiglia di respingere l'utente Dialog in onPause() in modo da ignorarlo.

anche prima di congedare è possibile verificare la presenza di null e sta mostrando come qui di seguito frammento:

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

ha già scritto che sta facendo licenziamento() e relativo a DialogFragment. –

+0

Penso che funzioni sia per Dialog che DialogFragments @PareshMayani – Venky

+2

Credo che @PareshMayani sia corretto Venky. Il tutorial su 'DialogFragment' di google non mostra affatto il metodo' onPause() '. Ma penso di vedere quello che stai facendo. Che cosa è il punto se l'utente non sta chiamando 'onPause()'. Questo è quando il sistema sa che il frammento viene chiamato via. Che dire di quando, ad esempio, un utente annulla. In questo caso, qual è il modo migliore per chiuderlo? – Andy

48

Penso che un modo migliore per chiudere una DialogFragment è questo:

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

In questo modo non dovete tenere un riferimento al DialogFragment e può chiudere da tutto il mondo.

Problemi correlati