Android ViewPager+Fragment遇到系统主题更换时Fragment不正常刷新
·
前言
最近有个UI布局需要用到ViewPager+Fragment来做首页左右滑动切换,开发时一直正正常常的,开开心心无忧无虑,结果到最后适配深色模式的时候,一切换系统主题,activity重建,崩溃。。。
年轻的我就想是不是fragment还没add到Viewpager就调用了,一顿操作。
结果在Fragment中判断isAdded一直是false,瞬间蒙圈。
在百度搜索了一下,基本确定是Activity的mFragments在页面突然结束时被保存了起来,第二次启动就去读取缓存的了。导致我们的Fragment用的一直是旧的,用不来哦
解决方法
1、 viewpager的adapter继承FragmentStatePagerAdapter
2、复写adapter的方法instantiateItem,主要是清空存储,使得Fragment能够重新创建。
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)
}
3、 在Activity中调用Fragment时判断isAdded
override fun onUserInfoObserver(info: RDUserInfo) {
super.onUserInfoObserver(info)
// 判断是否加入Activity
if (!isAdded) {
GlobalScope.launch {
Thread.sleep(100)
withContext(Dispatchers.Main) {
onUserInfoObserver(info)
}
}
return
}
updateUserInfoShow(info)
}
完事
更多推荐


所有评论(0)