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

swa*_*ner 10 android illegalstateexception android-fragments fragmentmanager

如果用户没有数据,我会显示一个空片段.在那个emptyFragment(in 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
Run Code Online (Sandbox Code Playgroud)

这是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();
    }
Run Code Online (Sandbox Code Playgroud)

Mim*_*oli 5

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

第二:我建议阅读两个关于片段提交状态丢失的小教程.您可以找到许多与片段相关的错误条件.

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

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

commitNow()如果您使用支持库,我们建议您采用支持库,可用于前24个设备.


Tíb*_*íbó 0

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

对于旧版本:FragmentManager.executePendingTransactions()调用后commit()