前言
最近有個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)
}