我遇到了一个我有一个包含多个片段的Activity的问题。对于任何单个片段,您可以执行搜索操作,该工作正常...如果您从任何片段中搜索,它将显示一个新的Activity来处理搜索,然后将结果返回到Activity以处理显示新片段。问题是,在搜索操作之后,我希望能够使用popBackStackImmediate(...)
清除(几乎)所有碎片,并且自调用saveInstanceState(...)
以来,我得到一个例外:
"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"
知道如何在调用onSaveInstanceState
后从后台堆栈弹出?
答案 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()
。
在大多数情况下,即使我不需要保存状态,也会遇到错误。