【发布时间】:2013-02-06 23:31:14
【问题描述】:
我使用 Otto 总线将事件从活动传递到片段。问题是,片段由ViewPager 管理,并且可以重新创建片段而无需执行其onPause() 和/或onResume()。其令人不快的副作用是,当在onPause() 中调用bus.unregister(fragment) 时,调用会定期失败并出现IllegalArgumentException。我还怀疑可能会错过对我的@Subscribe 注释方法的调用,因为bus.register() 调用在onResume() 方法中,也不能调用。而且,不幸的是,没有bus.isRegistered(fragment) 方法可以进行安全检查。
有没有更好的方法来注册/注销 ViewPager 托管片段?
我知道this post 讨论了类似的设置,但它不包括在 ViewPager 中运行的片段
【问题讨论】:
-
您使用的是哪个片段寻呼机? FragmentPagerAdapter 还是 FragmentStatePagerAdapter?我问,因为我已经转换为在 onResume 中注册和在 onPause 中取消注册的这种方法,并且没有注意到您使用 FragmentStatePagerAdapter 描述的任何副作用。
-
另外,也许你在“片段可以在不执行其 onPause 或 onResume() 的情况下重新创建片段”这一行中看到指示“娱乐”的一些信息?我真的不确定如果没有这些电话,娱乐会意味着什么,或者你如何检测到它。
-
我在写问题时正在使用 FragmentPagerAdapter。现在使用 FragmentStatePagerAdapter 进行测试。当我提到“娱乐”时,我的意思是旧的 Fragment 对象可以被扔掉并看似被另一个对象替换,所以例如我已经学会了不要将任何东西保存为 Fragment 中的字段。似乎同样适用于 onPause/onResume。在处理 ViewPager 和 Fragments 时,很少有问题提到缺少这些调用
-
我不确定,但这听起来很可疑。我的理解和我的代码库的情况似乎是,当分页片段离开屏幕时,它们会通过其标准生命周期调用被分离。查看
FragmentPagerAdapter.destroyItem()的源代码,有一个对FragmentTransaction.detach的调用,这将导致Fragment 经历其生命周期。我假设你正在记录 onPause on Resume 并打印出this这样你就可以看到进行调用的片段的对象ID? -
我想我试图暗示问题可能出在其他地方。当我在片段中包含片段或在片段中有 ViewPager 时,我已经看到类似的问题。您是否已更新到最新的支持库?我想我想为您确认我无法重现该问题,因此可能有其他情况因素导致您看到的情况。
标签: android android-fragments android-viewpager otto