问题现象:
一般出现在单activity+多fragment结构,当应用异常后,会可能出现这种现象
问题出现本质:
- 应用出现异常,部分手机机型会重新调用activity的生命周期方法
- activity发生变换,size,orenitation变化等
- 或者其他引起activity重新调用生命周期的情况
因为activity会自动尝试恢复之前的UI,并且我们自己又重新调用了一遍业务UI代码,所以会在当前的activity的frament栈再次添加新的fagment,所以出现多重UI重叠的现象
解决方案:
- 参考网上给出的方案,在activity的onSaveInstanceState中,不让activity保存UI状态
override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) {
//super.onSaveInstanceState(outState, outPersistentState)
}
- 但是,我发现在有的情况下,还是会出现UI重叠现象,下面是我自己的解决方案:
- 在UI代码中,添加fragment,采用如下代码,给每一个添加的fragment添加一个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)
}
//展示第一个fragment
trans.show(fragmentList[0].first)
}.commitAllowingStateLoss()
}