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不正常刷新
以一颗童心善待生活