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(); } } 
  • GetSupportFragmentManager (). FindFragmentById () devuelve null
  • El selector de pestañas no funciona en la pestaña anterior haga clic al deslizarlo en viewpager
  • Cuestión en Android Fragmento: sigue haciendo clic en el fragmento anterior
  • Práctica recomendada para fragmentos anidados en Android 4.0, 4.1 (<4.2) sin utilizar la biblioteca de soporte
  • ActionBarActivity botón de retroceso no estallar de backstack
  • El título de ActionBar cambia dinámicamente con el fragmento
  • "RequestFeature () debe ser llamado antes de agregar el contenido" plantilla de detalle maestro
  • ViewPager con fragmentos anidados?
  • Cómo establecer los valores de la interfaz de usuario en fragmento
  • Espresso Recylerview en ViewPager compara varias vistas
  • (Deprecated) Fragmento onOptionsItemSelected no se llama
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.