如果用户没有数据,我会显示一个空片段。在那个emptyFragment(在onViewCreated
中)我检查一个条件,有时想用另一个替换那个空的Fragment,所以我在相应的活动上调用一个替换该片段的方法。
有些用户(目前只有三星,6.0.1,但我不知道这是否意味着什么)在我executePendingTransactions
的行上遇到了崩溃:
IllegalStateException:
Fatal Exception: java.lang.RuntimeException
Unable to resume activity
{....app.activities.MyActivity_}:
java.lang.IllegalStateException: FragmentManager is already executing transactions
这是6.0.1中的错误还是onViewCreated
错误的地方?
修改
这是一个可能的解决方案吗?
if (addToBackStack) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).addToBackStack(name).commitAllowingStateLoss();
getSupportFragmentManager().executePendingTransactions();
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).commitNow();
}
答案 0 :(得分:5)
首先:你为什么不在你的活动中移动'检查条件'?通过这种方式,您可以决定所需的片段是什么:管理空值的片段或另一个片段。
第二:我建议阅读两篇关于片段commit和state loss的小教程。您可以找到许多与片段相关的错误条件。
最后答案与'FragmentManager已经在执行事务'有关:至少有两个嵌套调用executePendingTransactions()
方法,这意味着你要求片段管理器(有一个实例)每个Activity的片段管理器)在执行另一个事务时执行事务。很难确定问题的位置,你应该发布活动的所有代码和所有涉及的碎片,只是为了识别并删除对executePendingTransactions的一个(第一个)调用,但我可以给你一些提示:
executePendingTransactions()
。很难保留需要在片段之间进行编排的代码commit()
。只要主线程空闲,简单提交就会执行所有事务。commitNow()
。老实说,我几次使用这种方法,主要是为了正确处理DialogFragments。 commitNow()
适用于前24个设备。
答案 1 :(得分:0)
如果您正在处理sdk 24,请尝试FragmentTransaction.commitNow();
,而不是使用commit()
对于旧版本:FragmentManager.executePendingTransactions()
commit()