Android Kotlin中如何实现返回页面后保持TabLayout选中标签不变
问题根因
该问题通常是TabLayout所在的宿主(Activity/Fragment)在跳转新页面回到前台时,没有保存和恢复当前选中的Tab位置,或重复初始化ViewPager、TabLayout绑定逻辑,导致默认回到第0个Tab位置。
解决步骤
- 首先在宿主中声明变量存储当前选中的Tab位置,默认值为0
private var currentSelectedTab = 0
- 给TabLayout添加选中监听,实时更新存储的选中位置
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { tab?.let { currentSelectedTab = it.position viewPager2.currentItem = it.position } } override fun onTabUnselected(tab: TabLayout.Tab?) {} override fun onTabReselected(tab: TabLayout.Tab?) {} })
- 调整TabLayout和ViewPager2的绑定逻辑,仅在宿主首次创建时执行绑定,避免重复绑定重置选中位置
如果使用TabLayoutMediator绑定,代码如下:
// 仅savedInstanceState为null(首次创建)时执行绑定 if (savedInstanceState == null) { TabLayoutMediator(tabLayout, viewPager2) { tab, position -> tab.text = when(position) { 0 -> "今日" 1 -> "即将到来" else -> "往期" } }.attach() } // 注意:ViewPager2的Adapter也仅需在首次创建时设置一次,不要每次回到页面都重复设置Adapter
- 重写宿主的
onSaveInstanceState方法,持久化存储选中位置,避免宿主被系统销毁重建时丢失状态
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("SELECTED_TAB_POSITION", currentSelectedTab) }
- 在宿主初始化时恢复选中位置
Activity场景在onCreate中恢复:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 其他初始化逻辑,比如初始化ViewPager2、设置Adapter等 savedInstanceState?.let { currentSelectedTab = it.getInt("SELECTED_TAB_POSITION", 0) } // 等ViewPager2渲染完成后设置选中位置 viewPager2.post { viewPager2.currentItem = currentSelectedTab } }
Fragment场景在onViewCreated中恢复即可,逻辑和上面一致。
你当前提供的ViewPageAdapter代码没有问题,无需修改。
内容的提问来源于stack exchange,提问作者Jaanu
相关产品推荐
相关产品推荐

