saveInstanceState()之后的popBackStack()

时间:2011-09-19 17:31:04

标签: android android-fragments

我遇到了一个我有一个包含多个片段的Activity的问题。对于任何单个片段,您可以执行搜索操作,该工作正常...如果您从任何片段中搜索,它将显示一个新的Activity来处理搜索,然后将结果返回到Activity以处理显示新片段。问题是,在搜索操作之后,我希望能够使用popBackStackImmediate(...)清除(几乎)所有碎片,并且自调用saveInstanceState(...)以来,我得到一个例外:

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

知道如何在调用onSaveInstanceState后从后台堆栈弹出?

7 个答案:

答案 0 :(得分:20)

显然我的问题源自onActivityResult(...)中的调用

我能够通过将UI修改代码放在Runnable中,然后将Runnable发布到主线程来解决问题:

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

答案 1 :(得分:17)

在您的逻辑之前先调用super.onActivityResult,问题将在FragmentActivity的onActivityResult调用mFragments.noteStateNotSaved();

时得到解决

答案 2 :(得分:5)

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

而不是你可以检查,活动是否可见?在调用popBackStackImmediate()之前。

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

例如:

public class MainActivity extends Activity {

// Below flag used to check activity visible or not?
private boolean isActivityVisible;

    @Override
    public void onResume() {
        super.onResume();
        isActivityVisible = true;
    }

    public void onPause() {
        super.onPause();
        isActivityVisible = false;
    }

}

答案 3 :(得分:1)

如何在开始相关活动之前立即弹出堆栈?在调用startActivity之前不会调用onSaveInstanceState(并且新活动出现在当前的one0之前......紧接在此之前,将片段堆栈弹回到所需状态,然后调用startActivity。

由于片段堆栈是正常任务/后台堆栈上的一层,我认为“从中间”修改它会导致问题,这就是你看到问题的原因。

答案 4 :(得分:0)

我已经尝试了许多解决方案来使其工作。只有这个对我有用;

getActivity().getSupportFragmentManager().popBackStackImmediate();

答案 5 :(得分:0)

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

{ "took": 4632, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 130, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "logs", "_type": "log", "_id": "yrsas24BmxPy23WAM2TeeQ", "_score": 1.0, "_source": { "name": "something23", "date": "2019-11-26T01:30:40", "sequence": 34 } }, { "_index": "logs", "_type": "log", "_id": "y7sas24BmxPy23WAM2TeeQ", "_score": 1.0, "_source": { "name": "something", "date": "2019-11-26T01:32:23", "sequence": 23 }

答案 6 :(得分:-4)

或者只是将其放入try-catch中:

from_museum_id  year    number_loaned
2               2015    4

这与try { getSupportFragmentManager.popBackStack() } catch (IllegalStateException e) { // ignore } 基本相同,除了我们没有commitAllowingStateloss()

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