Fragment IllegalStateException - commit()导致状态丢失

时间:2018-05-30 23:22:18

标签: android android-fragments android-activity illegalstateexception

我有一个显示3个选项卡的FragmentStatePagerAdapter,其中第1个选项卡(片段)在其中提交了FragmentTransaction onCreateView()。对于某些用户,我看到一个由commit()状态丢失引起的IllegalStateException。

在阅读了几个堆栈溢出Q& As和Alex Fragment Transactions and Activity State Loss的博客文章之后,我更好地了解造成状态损失的原因,我可以采取多种方法。

  1. 我可以将我的片段提交移动到onPostResume。
  2. 我可以将我的片段提交移动到onCreate() - 可能是最安全的。
  3. 然而,onCreateView()中有很多逻辑,如果我采用上述方法,我可能会引入回归错误。我想知道,因为onCreate()最终会调用onCreateView(),如果可以只检查savedInstanceState为null。这会解决问题吗?

    这是我目前的代码:

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        FFragment frag = new FFragment();
        frag.setDateSelected(mDateSelected);
        getFragmentManager().beginTransaction()
                .add(R.id.container, frag, FRAG_TAG)
                .commit();
        ...
    }
    

    我的想象可以解决状态损失:

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        if(savedInstanceState == null) {
            frag = new FFragment();
            frag.setDateSelected(mDateSelected);
            getFragmentManager().beginTransaction()
                    .add(R.id.container, frag, FRAG_TAG)
                    .commit();
        } else {
            frag = (FFragment) getSupportFragmentManager()
                .findFragmentByTag(FRAG_TAG);
        }
        ...
    }
    

    为什么我要问这个而不仅仅是实施和测试它?我试图通过亚行和DDMS杀死这项活动,但无法重现状态损失 - 因此询问这种方法是否有效。或者,我是否必须执行不可避免的操作并将提交移至onCreate或onPostResume()?

    还有另一种测试触发状态丢失的方法吗?

1 个答案:

答案 0 :(得分:1)

有几件事你错了

  1. 您正在片段中使用getFragmentManager()和getSupportFragmentManager(),您应该在使用嵌套片段时使用getChildFragmentManager()

  2. Alex谈到的OnResumeFragments()和onCreate是关于活动而不是片段,在framgent中没有这样的方法

  3. 您提出的解决方案是完全不同的,在从Backstack重新创建活动时使用

  4. 解决方法是将代码移动到片段的onViewCreated()方法并使用childFragmentManager,我在片段中使用viewpager并在onViewCreated()内部初始化它,直到现在还没有遇到任何此类问题< / p>