You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码选中Tab时同步切换ViewPager2对应的Fragment?

解决ViewPager2与TabLayout绑定后代码切换Tab无效的问题

问题原因

在嵌套Fragment中使用ViewPager2时,若适配器绑定的是Activity的FragmentManager,会导致子Fragment生命周期管理异常,进而引发页面切换失效;另外直接在onViewCreated中设置currentItem可能因ViewPager2未完成初始化而不生效。

解决方案

1. 修正适配器的构造参数

将SettingsPagerAdapter的构造参数改为接收当前Fragment,确保子Fragment由父Fragment的子FragmentManager管理:

class SettingsPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
    private val mFragments = arrayOf(
        SettingsFirstFragment(),
        SettingsSecondFragment()
    )

    override fun getItemCount() = mFragments.size

    override fun createFragment(position: Int) = mFragments[position]
}

2. 初始化适配器并延迟设置切换

在SettingsFragment中,将适配器与当前Fragment绑定,并通过post()延迟设置currentItem,确保ViewPager2完成初始化:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val tabLayout = binding.tabs
    val mViewPager = binding.pager
    // 传入当前Fragment而非Activity
    mViewPager.adapter = SettingsPagerAdapter(this)

    TabLayoutMediator(tabLayout, mViewPager) { tab, position ->
        tab.text = when(position) {
            0 -> "First Tab"
            1 -> "Second Tab"
            else -> ""
        }
    }.attach()

    // 延迟执行,确保ViewPager2完成初始化
    mViewPager.post {
        mViewPager.currentItem = 1
    }
}

原理说明

  • 嵌套Fragment场景下,使用父Fragment的子FragmentManager管理ViewPager2内的子Fragment,能保证子Fragment的生命周期与父Fragment同步,避免页面切换时的异常。
  • post()方法会将任务加入View的消息队列,等待View完成布局初始化后执行,此时设置currentItem才能正确触发ViewPager2的页面切换,同时TabLayout会通过TabLayoutMediator自动同步选中状态。

内容的提问来源于stack exchange,提问作者Peter Klepč

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:10:42