onViewCreated - 替换片段的错误位置?

10

如果用户没有数据,我会显示一个空片段。在 emptyFragment(在 onViewCreated 中)中,我检查某个条件,并有时想用另一个片段替换空片段,因此我调用了相应活动的一个方法来替换该片段。

一些用户(目前仅限三星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版本中的一个bug吗?还是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();
    }

当我在Fragment.onResume()同步执行replaceFragment()时,遇到了与“FragmentManager is already executing transactions”相同的异常。它是浮动异常。 - StepanM
2个回答

5
首先:为什么不在您的活动中移动“检查条件”?这样,您可以决定您需要管理空值的片段还是其他片段。
其次:我建议阅读两篇关于片段的小教程commitstate loss。您可以在那里找到许多与片段相关的错误条件。
最后,与“FragmentManager已执行事务”相关的答案是:至少有两个嵌套调用executePendingTransactions()方法,这意味着您正在要求片段管理器(每个Activity只有一个片段管理器实例)在执行另一个事务时执行事务。很难确定问题所在,您应该发布所有活动代码和所有涉及的片段,以便识别和删除对executePendingTransactions的第一个调用,但我可以给您一些提示:
  1. 不要使用executePendingTransactions()。如果代码需要在片段之间进行某种协调,那么很难维护。
  2. 如果您不需要立即访问添加到Activity的片段,请使用commit()。简单的提交将在主线程空闲时执行所有事务。
  3. 如果需要立即访问片段,请使用commitNow()。老实说,我只用过这个方法几次,主要是为了正确处理DialogFragments。

如果您使用support library,则可在24版本之前的设备上使用commitNow(),我建议您采用它。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - swalkner
你尝试过移除 executePendingTransaction 吗? - Mimmo Grottoli
我只是建议保留您的代码,然后简单地删除所有对executePendingTransaction的调用。 - Mimmo Grottoli

0
如果你正在处理sdk 24,请尝试使用FragmentTransaction.commitNow();,而不是使用commit()
对于旧版本:在调用commit()后,使用FragmentManager.executePendingTransactions()

我正在使用executePendingTransactions() - swalkner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接