2012-02-08 19 views
30

Tengo una actividad que podría mostrar diferentes cuadros de diálogo durante el tiempo de ejecución. Yo uso onCreateDialog (int id) para crear cada diálogo y uso showDialog (int id) y el método dismissDialog (int id) para mostrar y descartar cada diálogo, respectivamente.Android - Cómo descartar todos los cuadros de diálogo en onPause

Cuando se llama a OnPause(), no sé qué cuadro de diálogo (si hay alguno) se está mostrando. Quiero asegurarme de que cuando se llama a OnPause, todos los cuadros de diálogo se borran. ¿Hay alguna forma recomendada de descartar todos los cuadros de diálogo? ¿Tendría que llamar a dismissDialog() para cada diálogo?

+0

He actualizado la respuesta – quinestor

Respuesta

12

Dependiendo de la cantidad de diálogos de los que estamos hablando. La respuesta corta es sí, tendrá que descartar cada diálogo.

Puede haber maneras elegantes de hacer esto aparte de simplemente tener algunos diálogos declarados en el nivel de actividad. Puede almacenar todos los cuadros de diálogo en un HashMap una vez que se declaran y luego iterar a través de la lista y cerrar cada uno en Pausa.

Dado que no sabe cuáles están abiertas, tendrá que pasar y probar o rastrear los estados.

Sin embargo, si realmente tiene tantos cuadros de diálogo en su pantalla, puede tener algunos problemas con su diseño de UI/UX, ya que Android debería darle un modelo que hace que sea fácil implementarlo sin lo que parece un diseño deficiente.

+6

Además, para evitar errores de despedir diálogos cerrados, puede utilizar todos los try-catch vez que descarta un diálogo. Esto es mucho más fácil de codificar que buscar cuadros de diálogo abiertos. – Arci

7

Con énfasis reciente de Android en el uso de DialogFragment contenedor que wil no tenga que llamar a despedir en cada

Desde los diálogos tendrán un recipiente Fragmento puede simplemente utilizar su ciclo de vida . Considere esto DialogFragment:

public class FragDialog extends DialogFragment{ 

    public ProgressDialog _dialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     if (savedInstanceState != null) { 
      //this.dismiss();  <-- The dialogs may be dismissed here 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) { 

     _dialog = new ProgressDialog(getActivity()); 
     return _dialog; 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     // <--------- You may overload onPause 
    } 
} 

¿Qué va a mostrar en su actividad utilizando un fragmentmanager normalmente llamando así:

FragmentManager fm = getSupportFragmentManager(); 
FragDialog fragDialog = new FragDialog(); 
fragDialog.show(fm, "my_tag"); 

Tenga en cuenta que en realidad se puede alterar lo que hace el DialogFragment en onPause. Cuando su actividad llame a Pausa, se llamará también a esta Pausa.

Descartar el diálogo en onPause() utilizando this.dismiss() no hará el trabajo porque una vez que la actividad se reanude también reanudará el diálogo. (Creo que esto se debe a que savestate se almacena antes de onPause).

Pero puede cerrar los diálogos de forma segura en onCreate si detecta un estado de instancia guardado (un currículum) como se muestra en el código.

+0

Esta es una solución ordenada y sigue funcionando en 2018, gracias. – Micer

12

Si está utilizando DialogFragment y desea borrar todo lo que puede utilizar:

/** 
* Dismiss all DialogFragments added to given FragmentManager and child fragments 
*/ 
public static void dismissAllDialogs(FragmentManager manager) { 
    List<Fragment> fragments = manager.getFragments(); 

    if (fragments == null) 
     return; 

    for (Fragment fragment : fragments) { 
     if (fragment instanceof DialogFragment) { 
      DialogFragment dialogFragment = (DialogFragment) fragment; 
      dialogFragment.dismissAllowingStateLoss(); 
     } 

     FragmentManager childFragmentManager = fragment.getChildFragmentManager(); 
     if (childFragmentManager != null) 
      dismissAllDialogs(childFragmentManager); 
    } 
} 
+0

Parece la solución más limpia hasta ahora para DialogFragment. ¿Lo usas en tus aplicaciones de producción? –

+0

@ grub- sí, lo hago –

Cuestiones relacionadas