解決Android jetpack導(dǎo)航組件Navigation返回Fragment重走onCreateView方法刷新視圖的問(wèn)題

在使用Navigation的過(guò)程中,發(fā)現(xiàn)其頁(yè)面跳轉(zhuǎn)效率確實(shí)很不錯(cuò),XML管理頁(yè)面跳轉(zhuǎn)邏輯以及fragment之間的參數(shù)傳遞使用起來(lái)都很方便,但是一個(gè)很大的問(wèn)題就是在fragment出棧返回上一頁(yè)時(shí),上一個(gè)fragment會(huì)重走onCreateView方法。而我們的很多view和數(shù)據(jù)初始化工作都是在onViewCreated之后進(jìn)行的,導(dǎo)致的結(jié)果是每次回上一個(gè)頁(yè)面可能會(huì)重新刷新,這一點(diǎn)體驗(yàn)很差。這里提供一個(gè)方法來(lái)避免每次重新創(chuàng)建view。

編寫一個(gè)BaseNavigationFragment:

class BaseNavigationFragment : BaseFragment() {
    protected var isNavigationViewInit = false//記錄是否已經(jīng)初始化過(guò)一次視圖
    private var lastView: View? = null//記錄上次創(chuàng)建的view
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        //如果fragment的view已經(jīng)創(chuàng)建則不再重新創(chuàng)建
        if (lastView == null) {
            lastView = super.onCreateView(inflater, container, savedInstanceState)
        }
        return lastView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        if(!isNavigationViewInit){//初始化過(guò)視圖則不再進(jìn)行view和data初始化
            super.onViewCreated(view, savedInstanceState)
            initView(view)
            initData()
            isNavigationViewInit = true
        }
    }
}

核心思路在上面的注釋,即保存上次創(chuàng)建的view,返回上一頁(yè)再次走onCreateView時(shí)直接將其返回,并且在onViewCreated方法中不再進(jìn)行初始化工作。
leak canary可能會(huì)提示lastView內(nèi)存泄漏,忽略即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容