android android-fragments illegalstateexception ondestroy supportmapfragment

Android: no se puede destruir la actividad después de terminar, causada por IllegalStateException: no se puede realizar esta acción después de onSaveInstanceState



android-fragments ondestroy (4)

Como tu actividad está siendo destruida, tus fragmentos serán destruidos automáticamente. Por lo tanto, no es necesario que los elimines. Simplemente elimine su método onDestroyView() .

Sé que se supone que no debes tener fragmentos dentro de fragmentos, pero el código funcionó en el pasado y no hay forma de evitarlo de todos modos.

En primer lugar, los fragmentos dentro de los fragmentos son compatibles a través del paquete de respaldo de Android de los fragmentos y la implementación nativa de fragmentos de Android 4.2+.

En segundo lugar, no está haciendo fragmentos dentro de fragmentos, al menos no en función del código que se muestra aquí. Por algún motivo, su TrackFragment está gestionando otro fragmento de nivel superior (su SupportMapFragment ), en lugar de delegar ese trabajo a la actividad.

Tengo una actividad en mi aplicación con 3 fragmentos. Cuando se presiona un botón en el primero, se llama a un método en la actividad que hace algunas cosas irrelevantes y luego llama a finish() .

Esto desencadena onPause() en el fragmento, que hace más cosas irrelevantes y luego llama a super.onPause() .

Luego, la aplicación carga la actividad anterior en la que se produjo (lógicamente después de la pila de la vista), y de repente se bloquea con la siguiente excepción cuando se llama a onDestroyView() en el Fragmento:

FATAL EXCEPTION: main java.lang.RuntimeException: Unable to destroy activity {be.niteowl.niteowl.debug/be.niteowl.niteowl.views.activities.VenueActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2793) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2811) at android.app.ActivityThread.access$2100(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3835) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327) at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574) at be.niteowl.niteowl.views.activities.TrackFragment.onDestroyView(TrackFragment.java:161) at android.support.v4.app.Fragment.performDestroyView(Fragment.java:1665) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:980) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1898) at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:324) at com.actionbarsherlock.app.SherlockFragmentActivity.onDestroy(SherlockFragmentActivity.java:88) at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2780) ... 11 more

El error parece ocurrir al intentar eliminar un MapFragment del Fragment principal. Sé que se supone que no debes tener fragmentos dentro de fragmentos, pero el código funcionó en el pasado y no hay forma de evitarlo de todos modos.

@Override public void onDestroyView() { SupportMapFragment f = (SupportMapFragment) activity.getSupportFragmentManager().findFragmentById(R.id.fragment_map); if (f != null) { activity.getSupportFragmentManager().beginTransaction().remove(f).commit(); } super.onDestroyView(); }

Busqué una solución aquí en SO ya (más notablemente obteniendo la excepción "IllegalStateException: no se puede realizar esta acción después de onSaveInstanceState" ), pero ninguno de ellos era aplicable a mi problema actual.


El siguiente código funcionó para mí. Se coloca en el fragmento que llama al fragmento del mapa

@Override public void onDestroy() { SupportMapFragment f = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapView); if (f.isResumed()){ getFragmentManager().beginTransaction().remove(f).commit(); } super.onDestroy(); }



A medida que se destruye tu actividad, lo que provoca la destrucción de los fragmentos, .commit () no se puede gestionar.

Eliminar getSupportFragmentManager (). BeginTransaction (). Remove (). Commit ().

Intente manejar en onBackPressed (), lo cual hice para mi aplicación