【发布时间】:2018-11-09 21:26:57
【问题描述】:
我有一个显示 3 个选项卡的 FragmentStatePagerAdapter,其中第一个选项卡(片段)在其 onCreateView() 中提交了 FragmentTransaction。对于某些用户,我看到由 commit() 状态丢失引起的 IllegalStateException。
在阅读了一些堆栈溢出问答和 Alex Lockwood 在Fragment Transactions and Activity State Loss 上的博客文章后,我更好地了解了导致状态丢失的原因,我可以采取多种方法。
- 我可以将片段提交移至 onPostResume。
- 我可以将我的片段提交移动到 onCreate() - 可能是最安全的。
但是,onCreateView() 内部有很多逻辑,如果我采用上述方法,我可能会引入回归错误。我想知道,因为 onCreate() 最终会调用 onCreateView(),是否可以只检查 savedInstanceState 是否为空。这能解决问题吗?
这是我当前的代码:
@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);
}
...
}
我为什么要问这个而不只是实现和测试它?我试图通过 ADB 和 DDMS 终止活动,但无法重现状态丢失 - 因此询问这种方法是否可行。或者,我是否必须做不可避免的事情并将提交移至 onCreate 或 onPostResume()?
还有其他方法可以测试触发状态丢失吗?
【问题讨论】:
-
你听说过 FragmentStatePagerAdapter 吗?这可能会有所帮助
-
@Deepakkaku 对不起,我应该写的。我正在使用它,只是对问题进行了编辑。
标签: android android-fragments android-activity illegalstateexception