El fragmento de diálogo omitido vuelve a aparecer cuando se reanuda la aplicación
Hola Estoy desarrollando una aplicación que utiliza mapas.
Estoy utilizando Fragmento Actividad y un fragmento llamado Fragmento-A.
- Fragmento en TabLayout sólo carga cuando el usuario desliza Android
- Actividades o Fragmentos en NavigationView?
- Aplicación Android basada en Java -> cambiar a Scala
- Las pestañas de Android en fragmento con barra de herramientas de contracción
- Cómo reiniciar la cámara de manera eficiente en un fragmento - Barcode Scanner
En Fragmento-A hay un botón, al hacer clic en ese botón aparece un fragmento de diálogo, muestra un mapa con alguna ubicación recibida previamente desde el servidor.
Digamos que este fragmento de diálogo es DialogFragment-B.
Tiene un botón para cerrar, un botón para navegar a Google Maps app para obtener direcciones.
Si el usuario navega a DialogFragment-B y regresa al Fragmento-A, al hacer clic en Cerrar botón, todo funciona bien.
Pero si el usuario hace clic en el botón Atrás, el fragmento de diálogo existente se cerrará normalmente y la aplicación funcionará normalmente.
Pero si el usuario pulsó el botón de inicio o recibió una llamada telefónica y onResume se llama a pesar de que el DialogFragment-B se descarta antes, vuelve a aparecer y al cerrar cerrar la aplicación con una excepción de puntero nulo
Aquí está mi código para abrir el DialogFragment-B.
FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); android.app.Fragment prev = fm.findFragmentByTag(MY_MAP); if (prev != null) { ft.remove(prev); } MyMapFragmentDialog newFragment = MyMapFragmentDialog .newInstance(eachPost); newFragment.show(ft, MY_MAP);
En DialogFragment-B al hacer clic en botón Cerrar, llamo MyMapFragmentDialog.this.dismiss ();
Por favor, si alguien ha encontrado este problema y superado, guíame a través.
- Actualizar el fragmento cuando se desactiva el diálogo
- ViewPager como una cola circular / envoltura
- El OnClickListener de Fragment llamado después de OnDestroyView
- Cómo obtener la vista de un fragmento fuera de OnCreateView ()
- Fragmentos dentro de un fragmento de la aplicación Android
- Ejemplo de servicio de primer plano
- Cómo ocultar la barra de acción (Sherlock) dentro de un fragmento?
- Problemas con pantallas de preferencias de doble panel
Tuve el mismo problema y se resolvió asegurándome de llamar a super.onDismiss(dialog)
en el método onDismiss
de mi subclase DialogFragment
.
Actualización: La respuesta de Kalina es una solución más elegante y simple – como lo descubrí más tarde!
Estoy enfrentando el mismo problema en una de mis aplicaciones, y no encontrar la respuesta en ninguna parte, pasé por el código fuente de la clase DialogFragment, que está disponible en:
Y allí, encontré la razón probable escrita en un comentario, dentro de la fuente del método onDismiss (diálogo DialogInterface):
// Note: we need to use allowStateLoss, because the dialog // dispatches this asynchronously so we can receive the call // after the activity is paused. Worst case, when the user comes // back to the activity they see the dialog again.
Lo que entendí de esto es que el despido no se guarda en el estado de la instancia, y cuando la actividad se reanuda, lo vuelve a mostrar de inmediato como parte de la restauración del estado de la instancia – suponiendo que el fragmento nunca fue descartado. Siendo un evento asincrónico, no hay forma segura de cometer el despido sin arriesgar un
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Excepción y accidente consecuente, que es probablemente por qué los autores de la clase optaron por hacerlo de esta manera.
La solución que funcionó para mí era monitorear por separado el estado del DialogFragment, por:
- Almacenarla en una variable de clase (denominada aquí "diálogo")
- Anulación del método onDismiss (diálogo DialogInterface) y
- Establecimiento de un booleano dialogDismissed flag to true
–
@Override public void onDismiss(DialogInterface dialog) { // dialogDismissed is a Class level variable in the containing Activity, // must be set to false each time the DialogFragment is shown dialogDismissed = true; }
-
Nota: si el DialogFragment es una clase separada, entonces un método en la actividad tendrá que ser llamado desde el onDismiss para hacer esto, tal vez mediante la creación de una interfaz
-
Esta bandera debe entonces ser comprobada en la actividad onResume () y un dismiss forzado (después de comprobar que el diálogo no es nulo):
–
@Override public void onResume() { super.onResume(); //... if (dialogDismissed && dialog != null) { dialog.dismiss(); } }
- Configurar el color de un objeto Paint en la vista personalizada
- ¿Por qué Picasso no está usando imageView.getContext ()?