当前位置: 首页 > 知识库问答 >
问题:

使用ViewPager2获取当前片段

左劲
2023-03-14

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

viewPager.getCurrentItem()提供当前显示的索引,而adapter.getItem(index)Fragment。除非在getItem()中保留对所有创建片段的引用,否则我不知道如何访问当前显示的片段。

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

我是否错过了ViewPager2

共有2个答案

昝阳嘉
2023-03-14

通过标签查找当前片段的解决方案似乎最适合我。我为此创建了这些扩展函数:

fun ViewPager2.findCurrentFragment(fragmentManager: FragmentManager): Fragment? {
    return fragmentManager.findFragmentByTag("f$currentItem")
}

fun ViewPager2.findFragmentAtPosition(
    fragmentManager: FragmentManager,
    position: Int
): Fragment? {
    return fragmentManager.findFragmentByTag("f$position")
}
  • 如果您的 ViewPager2 主机是 Activity,请使用 supportFragmentManagerfragmentManager
  • 如果您的 ViewPager2 主机是 Fragment,请使用 childFragmentManager

注意:

  • findFragmentAtPosition仅适用于在ViewPager2的RecyclerView中初始化的碎片。因此,您只能获得可见的位置1。
  • Lint将建议您从fun ViewPager2.findFragmentAtPosition中删除ViewPager2.,因为您没有使用ViewPager2类中的任何内容。我认为它应该保持不变,因为这种变通方法只适用于ViewPager2
钱照
2023-03-14

ViewPager2中,默认情况下,FragmentManager为片段分配了标签,如下所示:

第一个位置的片段具有标签< code >“F0”

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

第三个位置的片段有一个< code >“F2”标签,依此类推...所以你可以得到你的片段的标签,通过连接" f "和你的片段的位置。要获取当前片段,您可以从viewPager2位置获取当前位置,并使您的标记如下所示(对于Kotlin):

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

对于某一位置的碎片

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

如果使用此技术,可以强制转换片段并始终检查它是否不为 null。

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

记得

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

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

或者简单地说:

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

如果在Fragment中托管ViewPage2,请使用childFragmentManager而不是supportFragmentManager

 类似资料:
  • 我被告知使用FragmentStateAdapter的createFranie覆盖来按索引获取当前片段。 这就是我的适配器的外观。 在我们在此活动/片段上强制使用onSaveInstance/OnRestoreInstance之前,这一切正常。 ViewPager2重新加载已经存在的片段,我们需要一种访问方法。FragmentStateAdapter类中的以下LOC证明了这一点 在活动/片段重新创

  • 问题内容: 我正在使用jQuery。如何获取当前URL的路径并将其分配给变量? 范例网址: 问题答案: 要获取路径,可以使用:

  • 问题内容: 我想要的只是获取网站URL。不是从链接获取的URL。在页面加载过程中,我需要能够获取网站的完整,当前URL,并将其设置为一个变量,以便我随意使用。 问题答案: 使用: 如评论中所述,下面的行有效,但对于Firefox而言是错误的。

  • 下面是我的代码,它有,每个片断类嵌入了上的3个选项卡。我有菜单选项。如所示,通过选择一个选项,我需要更新当前可见的片段。要更新它,我必须调用fragment类中的一个方法。有人能建议一下如何调用那个方法吗? 假设下面是我要调用的具有方法的片段类:

  • 问题内容: 嗨,我写了一个应用程序,获取当前的纬度和经度并将其转换为相应的地址。我可以获取纬度和经度,但是如何使用json将其转换为相应的地址。我是json的新手。我尝试了一些示例代码,但没有得到地址 这是我的代码 请帮助我 提前致谢 问题答案: 要改回可读格式,您也可以使用Geocoder,但有时由于Google Play服务问题而无法正常工作。我将这个json地理编码用作第二种选择,以防万一。

  • 我正在制作抽屉菜单,目前正在使用: getSupportFragmentManager()。开始交易()。替换(R.id.mainfragment,f1)。提交(); 但是正如你所看到的,它总是用新的片段替换主片段。谢谢!

  • 问题内容: 有没有办法在控制器中获取当前使用的语言(不带)? 在服务中找不到任何内容。 问题答案: 是一个吸气剂和二传手。 请参阅在文档链接中找到的此演示: http://jsfiddle.net/PascalPrecht/eUGWJ/7/

  • 问题内容: 我正在使用以下代码来获取当前网址 是否有其他方法可以获取相同的URL,或者可能是获取当前URL的更好方法? 谢谢。 问题答案: 从参考: