如何通过代码选中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č
相关产品推荐
相关产品推荐

