ventana studio open from emergente ejemplo custom activity android android-dialogfragment

android - studio - open dialog fragment from activity



¿Cómo descartar correctamente un DialogFragment? (3)

Los documentos dicen esto para el método dismiss() de la clase Dialog :

Descarta este diálogo, quitándolo de la pantalla. Este método se puede invocar de forma segura desde cualquier hilo. Tenga en cuenta que no debe anular este método para realizar la limpieza cuando se descarta el diálogo, sino implementarlo en onStop() .

En mi código, todo lo que hago es llamar a getDialog().dismiss() para descartarlo. Pero no estoy haciendo nada más ni usando onStop() . Así que estoy preguntando exactamente cómo descartar correctamente un DialogFragment para evitar fugas de memoria, etc.


Creo que una mejor manera de cerrar un DialogFragment es esta:

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

De esta forma, no tiene que mantener una referencia al DialogFragment y puede cerrarlo desde cualquier lugar.


Debería descartarlo en onPause() para anularlo.

Además, antes de despedirlo, puede verificar null y muestra el siguiente fragmento:

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


tl; dr: la forma correcta de cerrar un DialogFragment es usar DialogFragment dismiss() directamente en DialogFragment .

Detalles : la documentación de los estados DialogFragment

El control del diálogo (decidir cuándo mostrarlo, ocultarlo, descartarlo) debe hacerse a través de la API aquí, no con llamadas directas en el diálogo.

Por lo tanto, no debe usar getDialog().dismiss() , ya que invocaría a dismiss() en el diálogo . En su lugar, debe utilizar el método dismiss dismiss() del DialogFragment en sí:

despido de vacío público ()

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 puede ver, esto se ocupa no solo de cerrar el diálogo sino también de manejar las transacciones de fragmentos involucradas en el proceso.

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