FragmentTabHost “can not perform this action after onSaveInstanceState”

当我们在使用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);
    }

至于系统为什么要做这个判断,然后抛出异常还不是很清楚,清楚的小伙伴可以给我留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值