首页 文章

saveInstanceState()之后的popBackStack()

提问于
浏览
34

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

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

有没有想过如何在 onSaveInstanceState 之后从后面的堆栈弹出?

6 回答

  • 17

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

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

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

    在您的逻辑之前首先调用 super.onActivityResult ,问题将得到解决,因为FragmentActivity的 onActivityResult 调用 mFragments.noteStateNotSaved();

  • -2

    这个答案可能对某人有所帮助 . 当您的活动不可见时,您无法调用popBackStackImmediate(...)它会抛出 illegal Exception: can not perform this action after onsaveinstancestate.

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

    如果您的活动不可见,请不要调用popBackStackImmediate . Through the boolean flag you can achieve, when activity opens again .

    例如:

    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;
        }
    
    }
    
  • 4

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

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

  • 1

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

    getActivity().getSupportFragmentManager().popBackStackImmediate();
    
  • 20

    或者只是把它放在try-catch中:

    try {
      getSupportFragmentManager.popBackStack()
    } catch (IllegalStateException e) {
      // ignore
    }
    

相关问题