Android – java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState,FragmentTabHost

androidandroid-fragmentsillegalstateexception

MainActivity have a FragmentTabHost in it ,and five Fragments add to this FragmentTabHost.
Here is the init code

protected void onCreate(Bundle savedInstanceState) {
        mFragmentManager = getSupportFragmentManager();
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, mFragmentManager, android.R.id.tabcontent);
        // Home
        mTabHost.addTab(
                mTabHost.newTabSpec(TAB_TAG_HOME).setIndicator(
                        newTabItem(R.drawable.mi_selector_tab_home,
                                R.string.mi_tab_item_milian)),
                TabFateFragment.class, null);

        // Serach
        mTabHost.addTab(
                mTabHost.newTabSpec(TAB_TAG_SEARCH).setIndicator(
                        newTabItem(R.drawable.mi_selector_tab_search,
                                R.string.mi_navi_title_search)),
                TabSearchFragment.class, null);

        // Msg
        mTabHost.addTab(
                mTabHost.newTabSpec(TAB_TAG_MSG).setIndicator(
                        newTabItem(R.drawable.mi_selector_tab_msg,
                                R.string.mi_navi_title_msg)),
                TabMsgFragment.class, null);

        // Nearby
        mTabHost.addTab(
                mTabHost.newTabSpec(TAB_TAG_NEARBY).setIndicator(
                        newTabItem(R.drawable.mi_selector_tab_nearby,
                                R.string.mi_navi_title_nearby)),
                TabNearbyFragment.class, null);

        // Me
        mTabHost.addTab(
                mTabHost.newTabSpec(TAB_TAG_ME).setIndicator(
                        newTabItem(R.drawable.mi_selector_tab_me,
                                R.string.mi_navi_title_me)),
                TabMeFragment.class, null);
       ......
}

And i have read this article ,find no FragmentTransaction#commit() in my code.

And i have tried not calling super.onSaveInstanceState(Bundle outState) in my Activity.onSaveInstanceState(outState)

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // super.onSaveInstanceState(outState);
    }

Here's the crash log

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(Unknown Source)
    at android.support.v4.app.BackStackRecord.commitInternal(Unknown Source)
    at android.support.v4.app.BackStackRecord.commit(Unknown Source)
    at android.support.v4.app.FragmentTabHost.onAttachedToWindow(Unknown Source)
    at android.view.View.dispatchAttachedToWindow(View.java:12134)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2453)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1207)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5483)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:778)
    at android.view.Choreographer.doCallbacks(Choreographer.java:591)
    at android.view.Choreographer.doFrame(Choreographer.java:561)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:764)
    at android.os.Handler.handleCallback(Handler.java:730)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5109)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

Best Answer

The onSaveInstanceState method is called before the Activity is about to be destroyed,to save the Activity data.It causes error to add Fragment to it after the data is saved.The solution is to replace the commit() method with commitAllowingStateLoss(),and the effect is the same.

Related Topic