当我们在使用Fragment+FragmentTabHost作为首页导航的时候可能会出现”can not perform this action after onSaveInstanceState”的异常。具体的错误堆栈是
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:1832)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManagerImpl.java:1850)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:643)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:603)
at com.chediandian.college.widget.TabFragmentHost.onAttachedToWindow(TabFragmentHost.java:276)
at android.view.View.dispatchAttachedToWindow(View.java:13580)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2836)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1522)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1263)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6501)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:817)
at android.view.Choreographer.doCallbacks(Choreographer.java:620)
at android.view.Choreographer.doFrame(Choreographer.java:589)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:803)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5572)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:966)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
这里我是重写了一个TabFragmentHost,来代替FragmentTabHost。这个问题出现的原因是,当系统回收调当前Activity的时候会执行Activity的onSaveInstanceState()方法,在这里会把FragmentManager里面的mStateSaved参数置为true,所以在这里抛出这个异常。
解决这个问题的方法有两个:
1.在FragmentTabHost里面所有commit()方法都使用commitAllowingStateLoss()替代,因为commitAllowingStateLoss()会跳过上述检查。
2.重写Activity里面的onSaveInstanceState()方法,把super()方法注释掉,不执行任何代码,这样,检查的时候也不会报错。如下
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
// super.onSaveInstanceState(outState, outPersistentState);
}
至于系统为什么要做这个判断,然后抛出异常还不是很清楚,清楚的小伙伴可以给我留言。