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

时间:2016-11-13 08:55:08

标签: android android-fragments illegalstateexception fragmentmanager

如果用户没有数据,我会显示一个空片段。在那个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();
    }

2 个答案:

答案 0 :(得分:5)

首先:你为什么不在你的活动中移动'检查条件'?通过这种方式,您可以决定所需的片段是什么:管理空值的片段或另一个片段。

第二:我建议阅读两篇关于片段commitstate loss的小教程。您可以找到许多与片段相关的错误条件。

最后答案与'FragmentManager已经在执行事务'有关:至少有两个嵌套调用executePendingTransactions()方法,这意味着你要求片段管理器(有一个实例)每个Activity的片段管理器)在执行另一个事务时执行事务。很难确定问题的位置,你应该发布活动的所有代码和所有涉及的碎片,只是为了识别并删除对executePendingTransactions的一个(第一个)调用,但我可以给你一些提示:

  1. 请勿使用executePendingTransactions()。很难保留需要在片段之间进行编排的代码
  2. 如果您不需要立即访问要添加到活动中的片段,请使用commit()。只要主线程空闲,简单提交就会执行所有事务。
  3. 如果您需要立即访问片段,请使用commitNow()。老实说,我几次使用这种方法,主要是为了正确处理DialogFragments。
  4. 如果您使用support library,我建议您采用

    commitNow()适用于前24个设备。

答案 1 :(得分:0)

如果您正在处理sdk 24,请尝试FragmentTransaction.commitNow();,而不是使用commit()

对于旧版本:FragmentManager.executePendingTransactions()

后调用commit()