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,但我不知道根本原因