問(wèn)題現(xiàn)象:
一般出現(xiàn)在單activity+多fragment結(jié)構(gòu)幸斥,當(dāng)應(yīng)用異常后,會(huì)可能出現(xiàn)這種現(xiàn)象
問(wèn)題出現(xiàn)本質(zhì):
- 應(yīng)用出現(xiàn)異常,部分手機(jī)機(jī)型會(huì)重新調(diào)用activity的生命周期方法
- activity發(fā)生變換,size,orenitation變化等
- 或者其他引起activity重新調(diào)用生命周期的情況
因?yàn)閍ctivity會(huì)自動(dòng)嘗試恢復(fù)之前的UI杰刽,并且我們自己又重新調(diào)用了一遍業(yè)務(wù)UI代碼,所以會(huì)在當(dāng)前的activity的frament棧再次添加新的fagment,所以出現(xiàn)多重UI重疊的現(xiàn)象
解決方案:
- 參考網(wǎng)上給出的方案,在activity的onSaveInstanceState中,不讓activity保存UI狀態(tài)
override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) {
//super.onSaveInstanceState(outState, outPersistentState)
}
- 但是,我發(fā)現(xiàn)在有的情況下,還是會(huì)出現(xiàn)UI重疊現(xiàn)象,下面是我自己的解決方案:
- 在UI代碼中,添加fragment,采用如下代碼,給每一個(gè)添加的fragment添加一個(gè)tag
- 在添加fragment之前,檢查受否存在舊的fragment,如果存在,則移除之前舊的fragment
private fun addFragment() {
val f1 = Fragment()
val f1Tag = "f1"
val f2 = Fragment()
val f2Tag = "f2"
val fragmentList= arrayListOf(Pair(f1,f1Tag), Pair(f2,f2Tag))
supportFragmentManager.beginTransaction().also {trans->
//首先移除之前存在fragment
fragmentList.forEach {fm->
val temp = supportFragmentManager.findFragmentByTag(fm.second)
if (temp != null) {
trans.remove(fm.first)
}
}
//添加新的fragment
fragmentList.forEach {
trans.add(it.first,it.second).hide(it.first)
}
//展示第一個(gè)fragment
trans.show(fragmentList[0].first)
}.commitAllowingStateLoss()
}