ViewPager2+Fragment+FragmentStateAdapter遇到系统主题更换时Fragment数据丢失
1. 问题描述:
在ViewPager 设置壁纸,导致Activity 获取Fragment 数据丢失
2. 解决方案:
设置 vp.isSaveEnabled = false ,设置不保存,在适配器中销毁item
引发问题:vp 重建之后,会丢失之前所在的位置
解决方案:Activity onSaveInstanceState 中保存数据,在 onRestoreInstanceState 中恢复状态
3. 代码实现:
在Activity : vp.isSaveEnabled = false override fun onRestoreInstanceState(savedInstanceState: Bundle) { super .onRestoreInstanceState(savedInstanceState) mStep = savedInstanceState?.getInt( "mStep" , mStep) if (mStep == STEP2) { step(STEP2) } else if (mStep == STEP3) { step(STEP3) } LogUtils.i( "onRestoreInstanceState mStep=$mStep" ) } override fun onSaveInstanceState(outState: Bundle) { outState.putInt( "mStep" , mStep) super .onSaveInstanceState(outState) } 适配器: /** * 通用Fragment 适配器 */ class SimpleFragmentStateAdapter(activity: FragmentManager, val fragments: List<Fragment>) : FragmentStatePagerAdapter(activity) { override fun getCount(): Int { return fragments.size } override fun getItem(position: Int): Fragment { return fragments[position] } override fun instantiateItem(container: ViewGroup, position: Int): Any { val mFragments = javaClass.superclass?.getDeclaredField( "mFragments" ) mFragments?.isAccessible = true (mFragments?.get( this ) as ArrayList<*>?)?.clear() val mSavedState = javaClass.superclass?.getDeclaredField( "mSavedState" ) mSavedState?.isAccessible = true (mSavedState?.get( this ) as ArrayList<*>?)?.clear() return super .instantiateItem(container, position) } } |
参考致谢:
Android ViewPager2+Fragment+FragmentStateAdapter遇到系统主题更换时Fragment数据丢失
Android ViewPager+Fragment遇到系统主题更换时Fragment不正常刷新
以一颗童心善待生活
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】