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
- Escenario de Android donde ondestroy () se llama sin onpause () o onstop ()
- OnCreate (Bundle savedInstanceState) en siempre nulo
- View.getContext devuelve null, ¿por qué?
- Ejecutar código en el estado onPause () o onStop () de la actividad
- Evitar que el diálogo se abra varias veces al reanudar la actividad
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: cuando usar onStart (), onStop ()?
- Documentación de la clase de aplicación Android lifecyle
- ¿Qué sucede si startActivity () se llama a la actividad ya creada?
- Nivel de aplicación onResume Android
- ¿Se llama onPause () o onStop () incluso si el teléfono muere por falta de energía?
- Mide la vista en el fragmento
- OnDestroy () - para establecer o no establecer variables de instancia a null?
- NullPointerException en Fragment Listener
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 actualizar el esquema de la tabla después de una actualización de la aplicación en Android?
- Acerca de arm-eabi-gcc y cross-compiling