saveInstanceState()之后的popBackStack()

Chr*_*ris 35 android android-fragments

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

"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"
Run Code Online (Sandbox Code Playgroud)

onSaveInstanceState有人知道如何在调用后从后面的堆栈弹出?

Chr*_*ris 21

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

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

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

  • 在您的逻辑之前首先调用super.onActivityResult,并且当FragmentActivity的onActivityresult调用mFragments.noteStateNotSaved()时,问题将得到修复. (6认同)

Shi*_*lpi 17

super.onActivityResult在您的逻辑之前先调用,问题将作为FragmentActivity的onActivityResult调用得到修复mFragments.noteStateNotSaved();


Thi*_*van 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;
    }

}
Run Code Online (Sandbox Code Playgroud)


Ben*_*orf 1

在开始关联活动之前立即弹出堆栈怎么样?onSaveInstanceState 在调用 startActivity 之前不会被调用(并且新的 Activity 出现在当前 one0 之前...在此之前,将片段堆栈弹出回您想要的状态,然后调用 startActivity。

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