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.