我有一个显示3个选项卡的FragmentStatePagerAdapter,其中第1个选项卡(片段)在其中提交了FragmentTransaction onCreateView()。对于某些用户,我看到一个由commit()状态丢失引起的IllegalStateException。
在阅读了几个堆栈溢出Q& As和Alex Fragment Transactions and Activity State Loss的博客文章之后,我更好地了解造成状态损失的原因,我可以采取多种方法。
然而,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()?
还有另一种测试触发状态丢失的方法吗?
答案 0 :(得分:1)
有几件事你错了
您正在片段中使用getFragmentManager()和getSupportFragmentManager(),您应该在使用嵌套片段时使用getChildFragmentManager()
Alex谈到的OnResumeFragments()和onCreate是关于活动而不是片段,在framgent中没有这样的方法
您提出的解决方案是完全不同的,在从Backstack重新创建活动时使用
解决方法是将代码移动到片段的onViewCreated()方法并使用childFragmentManager,我在片段中使用viewpager并在onViewCreated()内部初始化它,直到现在还没有遇到任何此类问题< / p>