【问题标题】:Is Using a 'Root' Fragment A Better Way Replace Fragments in ViewPager?使用“根”片段是在 ViewPager 中替换片段的更好方法吗?
【发布时间】:2015-08-02 17:43:45
【问题描述】:

在 ViewPager 中替换 Fragments 是一个已经被问过很多次的问题,但大多数答案都是 hack、损坏/不完整或太旧。这个例子运行得非常好 - https://github.com/danilao/fragments-viewpager-example 但它实际上使用了一个空的根片段并在 createView 上添加了真正的片段。

还有其他更好的方法可以避免使用根框架吗?

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    正确的方法是覆盖您的 PagerAdaptergetItemPosition() 以使用新的 Fragment 更新您的 PagerAdapter:

    当宿主视图试图确定一个项目的位置是否改变时调用。如果给定项目的位置未更改,则返回 POSITION_UNCHANGED;如果适配器中不再存在该项目,则返回 POSITION_NONE

    默认实现假定项目永远不会改变位置并且总是返回POSITION_UNCHANGED

    在这种情况下,没有改变的页面返回PagerAdapter.POSITION_UNCHANGED,被移除的Fragment返回PagerAdapter.POSITION_NONE,新的Fragment获得新的位置。

    您将更改PagerAdapter 中的基础数据,然后调用notifyDataSetChanged()。这就是触发ViewPager 为每个可见的Fragment 调用getItemPosition() 的原因,根据需要替换或移动它们。

    【讨论】:

    • 这种技术的一个小问题是,如果你想在FragmentPagerAdapter 中用 Fragment B 完全替换 Fragment A,Fragment A 只是简单地分离但没有被破坏,所以它仍然存在,即使你想摆脱它。你有解决方法吗?
    • @BladeCoder - 切换到FragmentStatePagerAdapter 肯定是一种方法。提供深层或持久标签是一种navigation anti-pattern,无论如何都应该避免。
    • 不能同意更多关于深度和持久标签,这就是为什么我一直不喜欢 Instagram 应用程序。我开发了一个应用程序,如果用户希望片段 A 或片段 B 表示选项卡的内容,用户可以在其中选择选项,并且我选择了子片段选项以允许即时切换显示。我相信这种方法在这种情况下是可以接受的。
    • 感谢您消除我的疑问。对于那些寻找完整示例的人,请查看stackoverflow.com/a/18612049/206292
    【解决方案2】:

    您的示例使用了正确的技术(根片段内的子片段)但方式错误:为了管理根片段内的子片段,它必须使用子片段管理器getChildFragmentManager()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多