DialogFragment mostrado desde onContextItemSelected no sobrevive onPause / onResume

Tengo un DialogDragment que puedo mostrar una de dos maneras:

1) Toque en un elemento ListView de su OnItemClickListener

2) Activando un menú contextual del ListView y seleccionando un elemento de menú

Hacer # 1 funciona bien en todos los eventos del ciclo de vida, pero si lo invoco a través de # 2 e hago una pausa en la actividad (al ir a Inicio) y la reanudación a través del conmutador de tareas, el cuadro de diálogo ya no se muestra. El fragmento está allí, y puedo girar el dispositivo y mostrar el diálogo.

He experimentado, y si pongo la demostración del DialogFragment en un Handler con un retraso de al menos 1/2 segundos, funciona.

El siguiente fragmento falla: muestra el cuadro de diálogo pero, a continuación, pausa / reanudación lo oculta:

public boolean onContextItemSelected(android.view.MenuItem item) { boolean consumed = false; switch (item.getItemId()) { case R.id.menu_item: showMyDialogFragment(); consumed = true; break; } return consumed; } 

Así que el siguiente fragmento funciona. Pausa / volver a mostrar el cuadro de diálogo de nuevo correctamente:

 public boolean onContextItemSelected(android.view.MenuItem item) { boolean consumed = false; switch (item.getItemId()) { case R.id.menu_item: new Handler().postDelayed(new Runnable() { public void run() { showMyDialogFragment(); } }, 300); consumed = true; break; } return consumed; } 

El reemplazo del retardo de los 300 ms con un retardo de 0 ms o 250 ms hace que se vuelva a romper. Este repetible 100% del tiempo.

Este es un hack terrible obviamente, empeorado por la constante que probablemente depende de la velocidad del dispositivo.

¿Alguien sabe por qué está pasando y / o ofrecer una solución mejor? Pasé horas en este tema y este es el mejor que podría llegar a.

Puedo reproducir esto en Android 4.2 (emulador ARM y Galaxy Nexus). No puedo reproducir sus resultados en un emulador x86 4.1, un Nexus S (4.1) y un Motorola RAZR i (4.0). También puedo reproducir el problema modificando una de mis propias muestras de libros. He presentado un problema, usando su ejemplo: http://code.google.com/p/android/issues/detail?id=41901 Por favor, agregue cualquier otra información que usted piensa que les ayudará a diagnosticar el problema.

Respecto a una solución, si 300ms funciona, tenemos uno de esos "problemas de sincronización", y no tengo la más remota idea de cómo trabajar en torno a él, a menos de no usar un menú para mostrarlo. Por ejemplo, con su aplicación de ejemplo, basta con cambiar a SHOW_AS_ACTION_ALWAYS (y por lo tanto tener que ser un elemento en la barra de acción en lugar de en un menú de desbordamiento) es suficiente para que el DialogFragment comporten correctamente. Esperemos que tenga una forma de ajustar su interfaz de usuario para compensar este error, o tal vez alguien va a cocinar otra solución y publicarlo aquí o en el problema.

Recomendaría destruir el diálogo en todas las pausas y volver a crear en onResume dependiendo del estado independientemente de cómo se invoque el diálogo. De lo contrario, se corre el riesgo de una pérdida de memoria si la aplicación es eliminada por el sistema operativo mientras está en pausa.

Para responder explícitamente a su pregunta, no confíe en el SO para mantener el estado de la aplicación.

  • ¿Cómo comprobar si la actividad es visible? OnResume no es suficiente
  • Cambio de configuración con Robolectric
  • El servicio de Android con START_STICKY se bloquea al eliminar la aplicación
  • Fragmento ciclo de vida: cuando "ondestroy" y "ondestroyview" no son llamados?
  • Acceso a la clase de aplicación en Broadcast Receiver
  • ¿Cómo terminar la actividad de los padres de la actividad infantil sin terminar / detener la actividad infantil?
  • Fragmentos: ¿cuál es el mejor lugar para medir vistas?
  • ¿Se puede reanudar una actividad de Android después de finalizar ()?
  • Comprender el ciclo de vida de la actividad de los fragmentos
  • ¿Por qué se llama onStop justo después de que se inicie mi actividad?
  • ¿Cuándo se llama a onActivityResult del fragmento con respecto al ciclo de vida de los fragmentos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.