Cómo mostrar un DialogFragment de un controlador

Tengo un Handler que exhibe un DialogFragment cuando recibe un mensaje particular. Esto normalmente funciona, pero si el fragmento ya se ha guardado, obtendré el siguiente error:

No se puede realizar esta acción después de OnSaveInstanceState E / AndroidRuntime (3898): en android.support.v4.app.FragmentManagerImpl.checkStateLoss E / AndroidRuntime (3898): FATAL EXCEPTION (FragmentManager.java:1299) E / AndroidRuntime (3898): en android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1310) E / AndroidRuntime (3898): en android.support.v4.app.BackStackRecord .commitInternal (BackStackRecord.java:541) E / AndroidRuntime (3898): en android.support.v4.app.BackStackRecord.commit (BackStackRecord.java:525) E / AndroidRuntime (3898): en android.support.v4.app .DialogFragment.show (DialogFragment.java:123) E / AndroidRuntime (3898): en com.malauzai.app.BaseActivity $ 2.handleMessage (BaseActivity.java:72) E / AndroidRuntime (3898): en android.os.Handler. DispatchMessage (Handler.java:99)

Ahora, sé que esto se espera, basado en el Javadoc para FragmentManager.beginTransaction:

Nota: Una transacción de fragmentos sólo se puede crear / validar antes de que una actividad guarde su estado. Si intenta confirmar una transacción después de Activity.onSaveInstanceState () (y antes de una Activity.onStart siguiente o Activity.onResume (), obtendrá un error.Esto es porque el marco se encarga de guardar los fragmentos actuales en el estado , Y si los cambios se hacen después de que el estado se guarda entonces se perderán.

Mi problema es que no puedo decir cómo prevenirlo. He intentado llamar a Handler.removeMessages() en onPause() , pero todavía se produce. He intentado establecer una bandera en onSaveInstanceState() y no mostrar el fragmento si está establecido, pero todavía se produce. Esto parece un problema bastante común, pero no puedo llegar a una solución que funcione. Básicamente, ¿cómo sé que el fragmento ya se ha guardado?

BTW, esto ocurre en mi BaseActivity (extends FragmentActivity), pero cada actividad tiene su propio controlador, por lo que no creo que esto debería ser un problema.

Mi último pensamiento está usando Fragment.commitAllowingStateLoss() , pero eso parece un hack.

EDIT: Aquí está el código que me está causando problemas:

 private final Handler mTimerHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case TIMER_MESSAGE_LOGOUT_WARNING: // throws IllegalStateException if fragment is already saved new LogoutWarningDialog().show(getSupportFragmentManager(), "dialog"); break; } } }; 

One Solution collect form web for “Cómo mostrar un DialogFragment de un controlador”

Supongo que en mi respuesta que está utilizando FragmentManager y agregar fragmentos a través de FragmentTransacts con etiquetas (o ids). Así que básicamente dentro de su BaseActivity usted podría hacer algo como esto

 FragmentManager manager = getFragmentSupportedManager(); Fragment fragmentIWannaKnowIfexists = manager.findFragmentByTag("Tag I used to create this Fragment inside FragmentTrasnsaction") // or manager.findFragmentById(ID_FROM_LAYOUT) if(fragmentIWannaKnowIfexists != null){ //we have this Fragment already } else { // this Fragment was not added already } 
  • ¿Cómo utilizar el patrón MVVM de Android con fragmentos?
  • Reemplazar el fragmento superior en la pila trasera
  • Android - Establecer id de fragmento
  • fragmentar dinámico fragmento android
  • Error de Android: no se puede realizar esta operación porque se ha cerrado el grupo de conexiones
  • Android - ListFragment dentro DialogFragment (AlertDialog): Fragmento no tiene una vista
  • Sustitución de un fragmento por otro fragmento dentro del grupo de actividad
  • Map-Fragment (v2) Nullpointer (tema bajo Lollipop?)
  • Excepción de puntero nulo con Fragmentos y EventBus
  • YouTubePlayerSupportFragment en el elemento ListView es nulo
  • ¿Cómo utilizar actividades o fragmentos en un flujo de trabajo de varias pantallas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.