phl*_*bas 12 android fragment android-support-library
自从我升级我的应用程序以使用支持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)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了有关stackoverflow的类似问题.他们中的一些人建议避免使用我不使用的替换方法.导致回滚崩溃的事务如下所示:
ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit()
Run Code Online (Sandbox Code Playgroud)
其他评论说如果您使用的片段转换在用户再次按下之前无法完成,则可能会出现这种情况.由于我确实在给定的片段上使用过渡动画,这可能是原因.但是,删除的过渡并不是一个选择,因为这仅仅发生在运行2.3.x版本的手机和错误是通过升级到LIB 11和SDK 4.2,我希望谷歌会在下一版本中修正它推出.
有任何类似的问题,有关是否计划在4.2.1中修复或支持r12的信息,或建议我可以做些什么来规避错误?
我正在尝试使用我在此处找到的提示来解决问题
所以我添加了executePendingTransactions()来立即执行事务:
ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit()
getFragmentManager().executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)
这应该确保背包总是处于一个干净的状态我希望并且没有任何我能想到的负面缺点.
更新 虽然它可以在普通电话上运行,但问题仍然存在于一些没有已知Android版本号的通用设备上,例如4.0.1或类似版本,而是报告一些日期,例如'Thu Mar 02 2006 00:00:00 GMT +0100(MEZ)'作为Android版本号,例如:samsung - espressowifixx - GT-P3110将给定日期报告为Android版本并产生片段添加异常......仍然很烦人.用户并不关心这些东西,所以它总是被指责的已经缺乏的开发人员.当然,对于数十亿美元的公司来说没问题,但是单个开发人员,只是做一些比编写应用更有用的时间;)
所以对我来说,事实证明我实际上是在尝试两次添加片段.也许在以前的支持库版本中,它只是吞下了这个并继续前进.不幸的是,甚至检查片段是否isAdded()
对我不起作用,因为在我的情况下,我在事务有时间实际添加第一个片段之前将它们背靠背调用.
我最终做的是创建一个布尔类变量,fragmentAdded
并在我进行事务后立即将其设置为true.然后我在尝试添加片段之前检查此布尔值.可能不是你的问题的解决方案,但对我来说它是,所以希望它有所帮助.
归档时间: |
|
查看次数: |
11508 次 |
最近记录: |