FragmentStateAdapter 引發的一連串問題

這個問題一直搜索相關資料沒發現,後來還是自己瞎琢磨解決的,主要問題還是沒仔細研究源碼弄清原理。

在開始詳細講解之前,先幾句話概括下問題和解決方式

  • 在模擬自動銷燬界面並恢復數據時,FragmentStateAdapter發現一直創建Fragment內嵌的Fragment。
    解決方式:以標籤形式創建內嵌Fragment,在發現如果已經存在標籤的內嵌Fragment的時候,便不再創建加入。
什麼是內嵌Fragment?

FragmentStateAdapter 本身以多個Fragment以Tab形式顯示,然後這些Fragment裏面再內嵌Fragment,就是內嵌Fragment了

爲什麼導致這個一直創建Fragment的問題?

因爲FragmentStateAdapter已經處理了保存View狀態、恢復View狀態,也包括恢復ChildFragment。我們在恢復的時候,如果不做特殊處理,會再次運行onViewCreated代碼再次創建ChildFragment

如何解決?

我們只要在創建ChildFragment的時候加入標籤Fragment的判斷即可避免重複創建

        // 先通過標籤形式查找
        val matissFragment = childFragmentManager.findFragmentByTag(MATISS_FRAGMENT_TAG)
        // 如果不存在,則重新創建並添加,如果已經存在就不用處理了,因爲FragmentStateAdapter已經幫我們處理了
        matissFragment ?: let {
            val newMatissFragment = MatissFragment.newInstance(
                    arguments?.getInt(MatissFragment.ARGUMENTS_MARGIN_BOTTOM)
                            ?: 0
            )
            childFragmentManager.beginTransaction()
                    .add(R.id.fragmentContainerView, newMatissFragment, MATISS_FRAGMENT_TAG)
                    .commitAllowingStateLoss()
        }
題外話

有關數據的恢復等等,該用ViewModel或者用其他方式時候的實現還是要用的,這個更多的是恢復View方面

代碼例子

可以學習下面的源碼,內嵌Fragment的形式顯示

一個非常豐富的開源庫,如果你需要相冊、錄製、錄音等操作,那麼這個也許對你有一定的幫助:

zhongjhATC/AlbumCameraRecorder: 🔥一個高效的多媒體支持操作庫,可多方面的簡單配置操作相冊、拍照、錄製、錄音等功能。也支持配套使用的展示圖片、視頻、音頻的九宮格功能。

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