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

Kotlin中如何保存ViewPager选中项状态,回退Fragment时保留选中位置

实现方案

问题根因

你当前遇到的状态重置问题,本质是ViewPager所属的Fragment跳转至其他页面后,视图被销毁(Fragment加入回退栈时默认会销毁视图实例),返回时重新执行onCreateView走默认初始化逻辑,将ViewPager和tab选中状态重置为初始的第0项,之前的选中位置没有被持久化存储。

实现步骤

  • 第一步:在ViewPager所属Fragment中声明全局变量存储当前选中位置
// Kotlin写法
private var currentTabPos = 0
// Java写法
private int currentTabPos = 0;
  • 第二步:同步更新存储的选中位置
    在两处位置更新currentTabPos的值:
  1. 自定义tab的点击事件中,点击tab切换页面时,将currentTabPos赋值为当前点击的tab对应位置
  2. 给ViewPager添加页面切换监听,滑动切换页面时同步更新值:
// ViewPager2示例
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
        super.onPageSelected(position)
        currentTabPos = position
        // 调用公共方法更新tab选中样式
        updateTabStyle(position)
    }
})

如果使用的是ViewPager1,在OnPageChangeListener的onPageSelected回调中做同样的赋值操作即可。

  • 第三步:视图重建后恢复选中状态
    在onCreateView中完成ViewPager、tab控件、适配器的全部初始化逻辑后,手动恢复之前保存的选中状态:
// 第二个参数设为false关闭切换动画,避免返回时闪屏
viewPager.setCurrentItem(currentTabPos, false)
updateTabStyle(currentTabPos)

updateTabStyle为你之前实现的修改tab选中/未选中样式的公共方法,将重复的样式更新逻辑抽成该公共方法调用即可。

可选增强

如果需要处理应用后台被系统杀死重启的场景,将选中位置存入实例状态Bundle中:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putInt("key_selected_tab_pos", currentTabPos)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    savedInstanceState?.let {
        currentTabPos = it.getInt("key_selected_tab_pos", 0)
    }
}

内容的提问来源于stack exchange,提问作者Enigma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:12:03