问题 片段已添加。支持lib


自从我升级我的App以供使用 支持lib rev。 11 反编译 SDK 4.2 我收到以下错误

java.lang.IllegalStateException: Fragment already added: i{4079e598 #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)

我已经阅读了有关stackoverflow的类似问题。他们中的一些人建议避免使用我不使用的替换方法。导致回滚崩溃的事务如下所示:

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

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

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


10536
2017-12-06 14:32


起源

得到同样的东西,但有 DialogFragment。 - Jason Robinson
我偶尔也会用DialogFragment得到它......我已经提交了一份报告 这里。但还没有答案。 - phlebas
支持库r12得到相同的错误。发布跟踪到android问题跟踪器也是如此。 - Sash0k


答案:


我试图使用我发现的提示解决问题 这里

所以我补充道 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版本并产生片段添加异常......仍然很烦人。用户不关心这些东西,所以它总是被指责的已经缺乏的开发人员。 当然,对于数十亿美元的公司来说没问题,但单个开发人员,只是做一些比编写应用更有用的时间;)


6
2018-01-12 21:54



我得到了完全相同的崩溃,我根本没有使用上面的线。我只是像这样添加ft.add(newFrag).addToBackStack(null).commit()。 - tasomaniac
@phlebas您能否建议我编辑支持库中的FragmentManager.java类 - Adi
请提及您的代码。 - Dwivedi Ji


所以对我来说,事实证明我实际上是在尝试两次添加片段。也许在以前的支持库版本中,它只是吞下了这个并继续前进。不幸的是,甚至检查片段是否存在 isAdded() 对我来说不起作用,因为就我而言,在交易有时间实际添加第一个片段之前,我正在紧接着调用它们。

我最终做的是创建一个布尔类变量 fragmentAdded 在我完成交易后立即将其设置为true。然后我在尝试添加片段之前检查此布尔值。可能不是你的问题的解决方案,但对我来说它是,所以希望它有所帮助。


5
2017-12-21 16:24



真的很难过,我们需要这样做。真的没有方法可以确定是否已添加片段吗? - Jeffrey Blattman