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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:03