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.

5 Solutions collect form web for “IllegalStateException: La actividad se ha destruido – cuando la aplicación está intentando mostrar DialogFragment una vez más”

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(); } } 
  • Fragmento no destruido en rotación
  • ¿Se llamará onSaveInstanceState a fragmentos en la pila trasera?
  • ¿Cómo separar fragmentos a diferentes archivos en android studio?
  • Fragmento: qué devolución de llamada se invocó al pulsar el botón de retroceso y personalizarlo
  • Agregar un fragmento como encabezado ListView
  • No se puede establecer una vista de lista personalizada en ListFragment
  • Establecer argumentos de fragmento de la actividad
  • No se puede usar barra de acción y Fragmento en Android 2.3
  • Fragmentos: ¿cuál es el mejor lugar para medir vistas?
  • Replace () no funciona correctamente con multi-fragmentos
  • Android: Fragmento de preferencia con un fragmento de cajón de navegación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.