Android saveInstanceState()之后的popBackStack()

Android saveInstanceState()之后的popBackStack(),android,android-fragments,Android,Android Fragments,我遇到了一个问题,我有一个包含多个片段的活动。对于任何单个片段,您都可以执行搜索操作,这很好…如果您从任何片段中搜索,它将显示一个新的活动来处理搜索,然后将结果返回给活动以处理显示新片段。问题是,在执行搜索操作后,我希望能够使用popbackinstanceimmediate(…)清除(几乎)所有片段,并且由于调用了saveInstanceState(…),我得到一个异常,该异常表示: "java.lang.IllegalStateException: Can not perform this

我遇到了一个问题,我有一个包含多个片段的活动。对于任何单个片段,您都可以执行搜索操作,这很好…如果您从任何片段中搜索,它将显示一个新的活动来处理搜索,然后将结果返回给活动以处理显示新片段。问题是,在执行搜索操作后,我希望能够使用
popbackinstanceimmediate(…)
清除(几乎)所有片段,并且由于调用了
saveInstanceState(…)
,我得到一个异常,该异常表示:

"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"

在调用了
onSaveInstanceState
之后,知道如何从后堆栈弹出吗?

在开始相关活动之前立即弹出堆栈怎么样?onSaveInstanceState在调用startActivity之前不会被调用(并且新活动位于当前活动的前面0…在此之前,将片段堆栈弹出到所需的状态,然后调用startActivity


由于片段堆栈是普通任务/后台堆栈之上的一层,我认为“从中间”修改它会导致问题,这就是为什么您会看到这个问题。

显然,我的问题源于在onActivityResult(…)中进行的调用

我可以通过将UI修改代码放入Runnable中,然后将Runnable发布到主线程来解决此问题:

Runnable r = new Runnable() {
    @Override
    public void run() {
        // UI code here
    }
};
Handler h = new Handler();
h.post(r);

先调用
super.onActivityResult
,然后再调用您的逻辑,问题将被修复为FragmentActivity的
onActivityResult
调用
mFragments.noteStateNotSaved();

此答案可能会对某些人有所帮助。当您的活动不可见时,您无法调用PopBackBackbackImmediate(…)它将抛出非法异常:在onsaveinstancestate之后无法执行此操作。

在调用popbackbackimmediate()之前,您可以检查活动是否可见

如果您的活动不可见,请不要调用PopBackbackImmediate。当活动再次打开时,可以通过布尔标志实现

例:


或者只是把它放在试一试中:

try {
  getSupportFragmentManager.popBackStack()
} catch (IllegalStateException e) {
  // ignore
}
这基本上与
committeallowingstateloss()
相同,只是我们没有
popbackallowingstateloss()


在大多数情况下,即使我不需要保存状态,我也会收到一个错误。

这对我有用的是检查片段管理器是否没有保存状态

if(fragmentManager!=null&&!fragmentManager.isStateSaved()){
fragmentManager.popBackStack();

}

伙计,你刚刚救了我的命。我几乎疯了,想弄清楚到底出了什么问题。+1解决了我遇到的问题!单顶活动,在onNewIntent中弹出片段后退。使用AndroidAnnotations将@UiThread添加到我的方法中修复了崩溃。先调用super.onActivityResult,然后再调用逻辑,问题将作为Fragm解决entActivity的onActivityresult调用MFFragments.noteStateNotSaved();谢谢兄弟,你让我开心了。我被困在这里面几十年了。我不明白最后一部分。所以如果我的活动不可见,我不做这个操作,我怎么知道一旦活动可见我就应该做呢?如果你想调用PopBackbackImmediate(…),当您的活动不可见时。将布尔值设置为true。当您的活动出现在前台时,可以在activity onResume()中检查布尔值,如果为true,则可以调用PopBackbackImmediate(…)准确程度如何?你能用一个代码示例编辑你的答案吗?如果包含了代码的和平,这应该是正确的答案!@YonatanNir似乎有时在调用onResume之前,活动会转到前台并可用于用户的操作。所以发生了此崩溃。谢谢,你救了我的一天哈哈
try {
  getSupportFragmentManager.popBackStack()
} catch (IllegalStateException e) {
  // ignore
}