Kotlin中如何保存ViewPager选中项状态,回退Fragment时保留选中位置
实现方案
问题根因
你当前遇到的状态重置问题,本质是ViewPager所属的Fragment跳转至其他页面后,视图被销毁(Fragment加入回退栈时默认会销毁视图实例),返回时重新执行onCreateView走默认初始化逻辑,将ViewPager和tab选中状态重置为初始的第0项,之前的选中位置没有被持久化存储。
实现步骤
- 第一步:在ViewPager所属Fragment中声明全局变量存储当前选中位置
// Kotlin写法 private var currentTabPos = 0
// Java写法 private int currentTabPos = 0;
- 第二步:同步更新存储的选中位置
在两处位置更新currentTabPos的值:
- 自定义tab的点击事件中,点击tab切换页面时,将
currentTabPos赋值为当前点击的tab对应位置 - 给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
相关产品推荐
相关产品推荐

