【问题标题】:onViewCreated - wrong place to replace fragment?onViewCreated - 替换片段的位置错误?
【发布时间】:2016-11-13 08:55:08
【问题描述】:

如果用户没有数据,我将显示一个空片段。在那个 emptyFragment(onViewCreated)中,我检查了一个条件,有时想用另一个替换那个空 Fragment,所以我在相应的活动上调用一个方法来替换这个 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();
    }

【问题讨论】:

  • 当在 Fragment.onResume() 中同步 replaceFragment() 时,我遇到了相同的异常“FragmentManager 已在执行事务”。是浮动异常。

标签: android android-fragments illegalstateexception fragmentmanager


【解决方案1】:

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

第二:我建议阅读关于片段commitstate loss的两个小教程。您可以在那里找到许多与片段相关的错误情况。

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

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

如果你使用support librarycommitNow()可用于pre 24设备,我建议你采用。

【讨论】:

  • 首先关于:因为首先我显示了一个无数据片段,然后,当网络调用返回时,我想用另一个替换它......
  • 您是否尝试删除 executePendingTransaction?
  • 我只是建议保留您的代码并简单地删除所有对 executePendingTransaction 的调用
【解决方案2】:

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

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

【讨论】:

  • 我正在使用executePendingTransactions()
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多