IllegalStateException: La actividad se ha destruido – cuando la aplicación está intentando mostrar DialogFragment una vez más

He encontrado un montón de preguntas similares en el stackoverflow, pero sus soluciones no funcionan en mi caso. Están conectados con el método onSaveInstanceState y la Biblioteca de soporte especialmente.

Tengo la Activity que funciona en un acontecimiento este código:

 MyDialogFragment.showMyDialog(name, this, this); 

name parámetro name es el objeto String. El segundo parámetro ( this ) es el objeto de clase Activity justo y el tercero (también this ) es la interfaz simple. Esta mi Activity implementa esta interfaz. showMyDialog() es, por supuesto, el método estático. Esto es cuerpo:

 MyDialogFragment fragment = new MyDialogFragment(listener, "Hello " + name); fragment.show(activity.getFragmentManager(), "myDialog"); 

Esto está funcionando bien en el primer intento. Pero en el segundo estoy recibiendo esta excepción:

 E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.myapp, PID: 20759 java.lang.IllegalStateException: Activity has been destroyed at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1345) at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597) at android.app.BackStackRecord.commit(BackStackRecord.java:575) at android.app.DialogFragment.show(DialogFragment.java:230) at com.example.myapp.view.dialog.MyDialogFragment.showMyDialog(MyDialogFragment.java:41) at com.example.myapp.MyActivity.showMyDialog(MyActivity.java:208) at com.example.myapp.MyActivity.onEvent(MyActivity.java:232) at com.example.myapp.MyActivity.handleMessage(MyActivity.java:89) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) 

En general, estos son los pasos para reproducir mi excepción:

  1. Enter Activity – evento se recibe para que MyDialogFragment se muestre.
  2. Descartar diálogo por botón negativo.
  3. Ingrese Activity una vez más – MyDialogFragment se muestra de nuevo.
  4. Escriba un código en el EditText.
  5. En este momento la validación lleva algún tiempo. Conectando con el servidor etc. Y el resultado negativo es vuelto. Por lo tanto, es necesario mostrar MyDialogFragment una vez más. Pero en este momento estoy recibiendo excepción.

Sin embargo, cuando omito el segundo punto y empiezo a escribir código incorrecto para la validación, MyDialogFragment se mostrará sin ningún problema. Comportamiento extraño.

He intentado con método no estático, setRetainInstance(true) y también commitAllowingStateLoss . Pero no había diferencia.

Es un poco extraño – o tal vez sólo un error en esta funcionalidad de Android. He añadido bloque try catch para coger lanzando excepción de esta manera:

 MyDialogFragment fragment = new MyDialogFragment(listener, "Hello " + name); try { fragment.show(activity.getFragmentManager(), "myDialog"); } catch (Exception e) { e.printStackTrace(); } 

Y por supuesto la excepción todavía está lanzando (y cogiendo en este momento) y qué es interesante mi fragmento del diálogo está recreando de manera correcta y el usuario puede interactuar con él.

En el método showMyDialog() pruebe primero:

 MyDialogFragment fragment = activity.findFragmentByTag("myDialog"); 

If (fragment == null) , luego inicializar:

 MyDialogFragment fragment = new MyDialogFragment(listener, "Hello " + name); 

Más mostrarlo:

 fragment.show(activity.getFragmentManager(), "myDialog"); 

ACTUALIZACIÓN:

 void showMyDialog() { MyDialogFragment fragment = activity.getFragmentManager().findFragmentByTag("myDialog"); if (fragment == null) { fragment = new MyDialogFragment(listener, "Hello " + name); } fragment.show(activity.getFragmentManager(), "myDialog"); } 

(Para API 17 y más)

En caso de que alguien todavía está teniendo este problema (o incluso relacionados con el método commit() una transacción) Acabo de añadir una comprobación antes de ella:

 private showFragment() { if (isDestroyed()) { return; } // Else do whatever transaction... } 

Sólo cambia la línea abajo

 MyDialogFragment.showMyDialog(name, this, this); 

a

 MyDialogFragment.showMyDialog(name, **"Activity class name.this"**, this); 

Tuve el mismo error mientras intentaba agregar un SupportMapFragment dentro de un DialogFragment . Podría solucionar este error utilizando getChildFramentManager() lugar de getFragmentManager() , como sugiere la API cuando se utilizan fragmentos anidados:

 public class GpsDialogFragment extends DialogFragment { private SupportMapFragment mapFragment; private static final String MAP_FRAGMENT_TAG = "MAP_FRAGMENT"; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.gps_postition_dialog, container, false); // ... // dynamically create the map fragment (https://stackoverflow.com/questions/14083950) FragmentManager fragmentManager = getChildFragmentManager(); mapFragment = (SupportMapFragment) fragmentManager.findFragmentByTag(MAP_FRAGMENT_TAG); if (mapFragment == null) { if (!getActivity().isFinishing()) { mapFragment = new SupportMapFragment(); FragmentTransaction ft = fragmentManager.beginTransaction(); ft.add(R.id.mapFrame, mapFragment, MAP_FRAGMENT_TAG); ft.commit(); fragmentManager.executePendingTransactions(); } } return view; } // ... @Override public void onPause() { if (mapFragment != null) getChildFragmentManager().beginTransaction().remove(mapFragment).commit(); super.onPause(); } } 
  • Elemento de Recyclerview efecto de ondulación de clic
  • Interferencia de la interfaz de usuario de Android al configurar el color de ActionBar
  • ¿Cómo evitar que un fragmento se agregue varias veces?
  • Obtenga GoogleMap del fragmento de ViewPager
  • Vista previa de la cámara Android en un fragmento
  • Disposiciones de Android: ¿Cómo evitar pesas anidadas?
  • Fragmento de Android OnCreateView llamado dos veces
  • Se hace clic en un diseño invisible detrás del fragmento:
  • IllegalStateException: No se puede cambiar ID de contenedor del fragmento
  • Agregue RecyclerView (RecyclerFragment) a un cuadro de diálogo
  • Fragmentos dentro de ViewPager no se destruyen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.