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:
- barra de herramientas ocultar androide en fragmento específico
- Fragmentos de Android que conservan datos
- Viewpager no aparece cuando se utiliza CollapsingToolbarLayout
- Excepción de tiempo de ejecución al utilizar la configuración de Android (estoy siguiendo el curso de desarrollo de Android de udacity)
- Actualizar el contenido de las pestañas de Android Sherlock
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:
- Enter
Activity
– evento se recibe para queMyDialogFragment
se muestre. - Descartar diálogo por botón negativo.
- Ingrese
Activity
una vez más –MyDialogFragment
se muestra de nuevo. - Escriba un código en el EditText.
- 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.
- SavedInstanceState al restaurar el fragmento de la pila trasera
- Cambio de orientación con viewPager dentro de FragmentActivity
- ¿Cómo puedo cambiar el menú de la opción en diversos fragmentos?
- Agrupar en onActivityCreated () devuelve null, incluso después de establecer valores en onSaveInstanceState ()
- Fragmento getArguments () devuelve null
- Android: Uso de StreetViewPanoramaView en XML
- Viewpager con altura dinámica no funciona (siempre use la altura del primer fragmento)
- ¿Cuándo usar y cuándo no usar fragmentos en Android?
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(); } }