Android ViewPager+Fragment遇到系統主題更換時Fragment不正常刷新

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)
    }

完事

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章