在 ViewPager 中使用 'Root' 片段是替换片段的更好方法吗?

Is Using a 'Root' Fragment A Better Way Replace Fragments in ViewPager?

Replacing Fragments in ViewPager 是一个被问过很多次的问题,但大多数答案都是 hack,broken/not 完整或相当陈旧。这个例子工作得很好 - https://github.com/danilao/fragments-viewpager-example 但它实际上使用了一个空的根片段并在 createView 上添加了真正的片段。

有没有其他更好的方法来避免必须使用根框架?

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

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

Called when the host view is attempting to determine if an item's position has changed. Returns POSITION_UNCHANGED if the position of the given item has not changed or POSITION_NONE if the item is no longer present in the adapter.

The default implementation assumes that items will never change position and always returns POSITION_UNCHANGED.

在这种情况下,未更改的页面 return PagerAdapter.POSITION_UNCHANGED,删除的 Fragment returns PagerAdapter.POSITION_NONE,新的 Fragment 获得其新的位置。

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