2012-06-26 53 views
79

Los documentos dicen que esto para el método de la clase dismiss()Dialog:¿Cómo descartar correctamente 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(). 

En mi código, todo lo que hago es llamar getDialog().dismiss() para descartarla. Pero no estoy haciendo nada más ni siquiera usando onStop(). Así que estoy pidiendo exactamente cómo desechar correctamente un DialogFragment para evitar pérdidas de memoria, etc ..

Respuesta

136

tl; dr: La forma correcta de cerrar una DialogFragment es utilizar dismiss()directamente en la DialogFragment.


detalles: Los documentation of DialogFragment estados

de control del cuadro de diálogo (decidir cuándo mostrar, ocultar, descartarlo) que se debe hacer a través de la API de aquí, no con el recurso directo al diálogo .

Por lo tanto, no se debe utilizar getDialog().dismiss(), ya que pueden invocar dismiss()en el diálogo. En su lugar, debe utilizar el método de la propia dismiss() DialogFragment:

public void despedir()

Descartar el fragmento y su diálogo. Si el fragmento se agregó a la pila posterior, todo el estado de la pila posterior hasta e incluyendo esta entrada aparecerá. De lo contrario, se comprometerá una nueva transacción para eliminar el fragmento.

Como se puede ver, este se ocupa no sólo de cerrar el cuadro de diálogo, sino también de manejar las transacciones de fragmentos que participan en el proceso.

Solo necesita utilizar onStop si creó explícitamente algún recurso que requiera limpieza manual (cierre de archivos, cursores de cierre, etc.). Incluso entonces, anularía onStop del DialogFragment en lugar de onStop del cuadro de diálogo subyacente.

+4

Desafortunadamente, esto está causando que mi actividad contenedora termine ... –

+0

@ScootrNova: No debería, probablemente tenga un error en otro lugar. ¿Cómo estás creando el fragmento? – Heinzi

+0

'protected void showDialogFragment (fragmento final DialogFragment) {final FragmentTransaction fTransaction = getSupportFragmentManager(). BeginTransaction(); fTransaction.addToBackStack (null); fragment.show (fTransaction, "dialog");} ' Lo siento por el trazador de líneas desagradable! Pero sí, podrías tener razón, así que por el momento he escrito otra forma de cerrar mis DialogFragments. La forma en que los descartaba usando el método dismiss() fue encontrar el fragmento por etiqueta y luego ejecutar descartar() si no era nulo. Oh y sí, estoy 'nuevo' haciendo el fragmento justo antes de pasarlo a ese método. –

0

Usted se debe desestimar Dialog en onPause() por lo anularlo.

también antes de despedir puede comprobar null y se muestra como a continuación fragmento:

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

ha escrito ya que está haciendo dismiss() y se trata de DialogFragment. –

+0

Creo que esto funciona para Dialog y DialogFragments @PareshMayani – Venky

+2

Creo que @PareshMayani es Venky correcto. El tutorial sobre 'DialogFragment' de Google no muestra el método' onPause() 'en uso. Pero creo que veo lo que estás haciendo. Sin embargo, cuál es el punto si el usuario no está llamando 'onPause()'. Eso es cuando el sistema sabe que el fragmento está siendo llamado. ¿Qué pasa cuando, digamos que un usuario cancela? ¿Cuál es una mejor manera de cerrarlo en ese caso? – Andy

48

creo que una mejor manera de cerrar una DialogFragment es la siguiente:

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

De esta manera usted no tiene que contener una referencia a la DialogFragment y se puede cerrar de todas partes.

Cuestiones relacionadas