片段已添加。支持库

Posted

技术标签:

【中文标题】片段已添加。支持库【英文标题】:Fragment already added. Support lib 【发布时间】:2012-11-24 14:38:42 【问题描述】:

自从我升级我的应用程序以使用 support lib rev。 11 并针对 SDK 4.2 编译我收到以下错误

java.lang.IllegalStateException: Fragment already added: i4079e598 #2 id=0x1020002 i
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1159)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:729)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1493)
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:477)
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174)

我在 *** 上读过类似的问题。他们中的一些人建议避免使用我没有使用的替换方法。导致回滚时崩溃的事务如下所示:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit()

其他 cmets 表示,如果您使用的片段转换在用户再次按下之前无法足够快地完成,则可能会发生这种情况。 由于我确实在给定的片段上使用了过渡动画,这可能是原因。但是,删除转换不是一种选择,因为这发生在运行 2.3.x 的手机上,并且该错误是通过升级到 lib 11 和 sdk 4.2 引入的,我希望谷歌将在下一个版本中修复它.

有没有人有类似的问题,是否计划在 4.2.1 中修复或支持 r12 的信息,或者建议我可以做些什么来规避错误?

【问题讨论】:

得到同样的东西,但使用DialogFragment 我偶尔也会通过 DialogFragment 得到它...我已经提交了报告 here。但还没有答案。 支持库 r12 出现相同错误。也将跟踪发布到 android 问题跟踪器。 【参考方案1】:

我正在尝试使用我找到的提示来解决问题 here

于是我加了executePendingTransactions(),立即执行交易:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit()
getFragmentManager().executePendingTransactions();

这应该确保后台堆栈始终处于我希望的干净状态,并且没有我能想到的任何负面缺点。

更新 虽然它确实适用于普通手机,但问题仍然存在于一些没有已知 Android 版本号的通用设备上,如 4.0.1 或类似版本,而是报告一些日期,如 'Thu Mar 02 2006 00:00:00 GMT+ 0100 (MEZ) ' 作为 Android 版本号,例如:samsung - espressowifixx - GT-P3110 将给定日期报告为 android 版本并产生片段添加异常......仍然很烦人。用户不关心这些东西,所以总是责怪已经亏本的开发者。 对价值数十亿美元的公司来说当然没问题,但是单个开发人员只需利用您的时间做一些比编写应用程序更有用的事情;)

【讨论】:

我遇到了完全相同的崩溃,我根本没有使用上面的行。我只是像这样添加 ft.add(newFrag).addToBackStack(null).commit() 。 @phlebas 你能建议我在 SUpport 库中编辑 FragmentManager.java 类吗【参考方案2】:

所以对我来说,事实证明我实际上是在尝试添加片段两次。也许在以前的支持库版本中,它只是吞下了这个并继续前进。不幸的是,即使检查片段 isAdded() 是否对我不起作用,因为在我的情况下,我在事务有时间实际添加第一个片段之前连续调用它们。

我最终做的是创建一个布尔类变量fragmentAdded,并在我进行交易后立即将其设置为true。然后我在尝试添加片段之前检查这个布尔值。可能无法解决您的问题,但对我来说确实如此,所以希望它有所帮助。

【讨论】:

真的很遗憾我们需要这样做。真的没有办法确定是否添加了片段吗?

以上是关于片段已添加。支持库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用支持库 25.0.0 及更高版本获取片段()

不使用支持库的 Android 4.0、4.1 (<4.2) 中嵌套片段的最佳实践

Android文件/文件夹选择器(支持多选操作),已封装为lib库,直接添加依赖即可。

从片段将菜单添加到活动支持工具栏

Android:使用支持片段管理器时复制片段

ActionBar(支持)和 Fragment(支持)