首页 > 解决方案 > 使用 ViewPager2 获取当前片段

问题描述

我正在迁移ViewPager到,ViewPager2因为后者应该解决前者的所有问题。不幸的是,当将它与 a 一起使用时FragmentStateAdapter,我找不到任何方法来获取当前显示的片段。

viewPager.getCurrentItem()给出当前显示的索引并且adapter.getItem(index)通常为当前索引创建一个新Fragment的. 除非保留对所有已创建片段的引用,否则getItem()我不知道如何访问当前显示的片段。

对于旧的ViewPager,一种解决方案是调用adapter.instantiateItem(index)它将在所需索引处返回片段。

我错过了什么ViewPager2吗?

标签: androidandroid-viewpagerandroidx

解决方案


默认情况下,在ViewPager2FragmentManager 中已将标签分配给片段,如下所示:

第一个位置的片段有一个标签"f0"

第二个位置的片段有一个标签"f1"

第三个位置的片段有一个标签,"f2"依此类推......所以你可以得到你的片段的标签,并将“f”与你的片段的位置连接起来。要获取当前 Fragment,您可以从 viewPager2 位置获取当前位置,并使您的标签像这样(对于 Kotlin):

val myFragment = supportFragmentManager.findFragmentByTag("f" + viewpager.currentItem)

对于某个位置的片段

val myFragment = supportFragmentManager.findFragmentByTag("f" + position)

如果您使用此技术,您可以转换 Fragment 并始终检查它是否不为空。

如果您在 Fragment 中托管 ViewPager2,请childFragmentManager改用。

记住

如果您overridengetItemId(position: Int)适配器中有 。那么你的情况就不同了。它应该是:

val myFragment = supportFragmentManager.findFragmentByTag("f" + your_id_at_that_position)

或简单地说:

val myFragment = supportFragmentManager.findFragmentByTag("f" + adapter.getItemId(position))

如果您将 ViewPager2 托管在 Fragment 中,请childFragmentManager使用supportFragmentManager.


推荐阅读