onViewCreated – 错误的地方,以取代片段?

如果用户没有数据,我将显示一个空的片段。 在那个空片段(在onViewCreated )我检查一个条件,有时想用另一个replace空的片段,所以我调用相应的活动,取代了片段的方法。

一些用户(目前只有三星,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错误的地方做到这一点?

编辑

这是一个可能的解决scheme吗?

  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(); } 

Related of "onViewCreated – 错误的地方,以取代片段?"

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

其次:我build议阅读关于片段提交和状态丢失的两个小教程。 你可以在那里find许多与碎片有关的错误条件。

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

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

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

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

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