在使用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)存泄漏,忽略即可。