Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • Android DialogFragment desaparece después del cambio de orientación
  • ¿Cuál es el orden correcto de llamar métodos de superclase en los métodos onPause, onStop y onDestroy? ¿y por qué?
  • La aplicación se reinicia en lugar de continuar
  • Actividad con servicio duradero en el fondo que no se matará
  • Métodos del ciclo de vida de la actividad: onPostResume significado
  • ¿Por qué se definen los métodos del ciclo de vida en la clase de actividad con el especificador de acceso protegido
  • ¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación va al fondo?
  • Fragmento ciclo de vida: cuando "ondestroy" y "ondestroyview" no son llamados?
  • 2 Solutions collect form web for “DialogFragment mostrado desde onContextItemSelected no sobrevive onPause / onResume”

    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.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.