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

完事

更多推荐