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; } } }; 

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 } 
  • Los elementos de RecyclerView desaparecen después de cambiar entre fragmentos
  • Fragmento no destruido en rotación
  • Implementación de un TabListener utilizando la biblioteca de soporte
  • Android restore instance state de un fragmento que está en backstack
  • Cómo utilizar diferentes onKeyDown en fragmento de una misma actividad
  • TabLayout dentro de la barra de herramientas
  • Pasar los toques a la vista bajo
  • ¿Cómo evitar la recreación de fragmentos cuando se selecciona de NavigationDrawer?
  • Android ViewPager Cargando fragmentos incorrectos
  • Memoria retenida por el fragmento
  • La variable de paso de Android de Xamarin de Actividad a Fragmento devuelve null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.