Android java.lang.IllegalStateException:保存状态失败:active已清除片段中的索引

Android java.lang.IllegalStateException:保存状态失败:active已清除片段中的索引,android,android-fragments,slidingmenu,Android,Android Fragments,Slidingmenu,首先,我的应用程序的结构如下: SpashActivity -> MainActivity -> switching between many fragments FragmentTransaction ft = fragmentManager.beginTransaction(); //ft.detach(fragment).attach(fragment).commitAllowingStateLoss(); // crashing ft.replace(getView(

首先,我的应用程序的结构如下:

 SpashActivity -> MainActivity -> switching between many fragments
FragmentTransaction ft = fragmentManager.beginTransaction();

//ft.detach(fragment).attach(fragment).commitAllowingStateLoss(); // crashing

ft.replace(getView().getId(), fragment).commitAllowingStateLoss(); // not crashing
我的应用程序用于在片段之间切换。我必须使用
attach
而不是
replace
来保持片段状态。它看起来像:

  public void switchContent(int index, String fragmentTag) {                
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    if (fragmentManager.findFragmentByTag(fragmentTag) != mContent) {
        if (!mContent.isDetached()) {
            transaction.detach(mContent);
        }
        if (null == fragmentManager.findFragmentByTag(fragmentTag)) {
            switch (index) {
            case 0:
                mContent = new CategoryFragment();
                break;
            case 1:
                mContent = new BookFragment();
                break;
            case 2:
                mContent = new BookDetailFragment();
                break;
             // etc
            }
        } else {
                mContent = fragmentManager.findFragmentByTag(fragmentTag);              
        }

        if (mContent.isDetached()) {
            transaction.attach(mContent);
        } else if (!mContent.isAdded()) {
            transaction.add(R.id.content_frame, mContent, fragmentTag);
        }

        transaction.addToBackStack(null);
        transaction.commit();
        fragmentManager.executePendingTransactions();
    }
    Handler h = new Handler();
    h.postDelayed(new Runnable() {
        public void run() {
            getSlidingMenu().showContent();
        }
    }, 50);
} 
当后堆栈计数降至零时,我的应用程序必须退出:

 @Override
public void onBackPressed() {
    if (0 == getSupportFragmentManager().getBackStackEntryCount()) {
        // show confirm exit dialog.
        // If user press ok, try to exit, the splash activity will call finish()  
         // if(dialog == ok){ 
           Intent intent = new Intent(MainActivity.this, SplashActivity.class);
           intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
           intent.putExtra(SplashActivity.EXIT_KEY, true);
           startActivity(intent);
         // }  
    } else {
        super.onBackPressed();
    }
}
但是,有时(不总是)当用户多次按back(返回)时,我会遇到异常并崩溃我的应用程序(即使确认退出对话框没有出现-平均返回堆栈计数大于零):

onSaveInstanceState
方法:

  @Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    try {
        Ln.d("onSaveInstanceState");
        outState.putInt(CURRENT_FRAGMENT_KEY, currentFragment);

        if (0 < getSupportFragmentManager().getBackStackEntryCount()) {
            getSupportFragmentManager().putFragment(outState, "mContent", mContent);
        }
    } catch (Exception ex) {
        Ln.e(ex);
    }
}
@覆盖
SaveInstanceState上的公共无效(束超出状态){
super.onSaveInstanceState(超出状态);
试一试{
Ln.d(“onSaveInstanceState”);
outState.putInt(当前\u片段\u键,当前片段);
如果(0
你能告诉我哪里错了吗?提前感谢。

尝试更改

 @Override
public void onBackPressed() {
    if (0 == getSupportFragmentManager().getBackStackEntryCount()) {

@覆盖
public void onBackPressed(){
如果(getSupportFragmentManager().GetBackbackEntryCount()<1){

我希望这能起作用

片段的状态会自动保存和恢复,无需在
onSaveInstanceState
方法中执行任何操作。不要在活动中保留对片段的任何引用(在您的情况下,
currentFragment
mContent
),如果您需要某个片段,请从
FragmentManager
获取,例如
findFragmentByTag

在分离和附加之间读取片段统计可能存在问题

尝试使用类似以下内容:

 SpashActivity -> MainActivity -> switching between many fragments
FragmentTransaction ft = fragmentManager.beginTransaction();

//ft.detach(fragment).attach(fragment).commitAllowingStateLoss(); // crashing

ft.replace(getView().getId(), fragment).commitAllowingStateLoss(); // not crashing

你找到这个问题的解决方案了吗?没有,我只是想当我使用replace而不是分离和附加片段时,这个错误没有发生。我不认为这是解决方案,在我的情况下,我做了一个replace事务,并且完成了这个错误:/I我也面临着类似的问题。你对此有什么解决方案吗。java.lang.illeglastATException:保存失败状态:活动片段已清除索引:-1如果是,请发布解决方案。抱歉,我仍然没有得到解决方案。如果您查找源代码,您可以发现活动片段列表中的片段索引为-1,但我不知道根本原因