Android Fragment重叠,UI重叠问题

问题现象:


一般出现在单activity+多fragment结构,当应用异常后,会可能出现这种现象

问题出现本质:


  • 应用出现异常,部分手机机型会重新调用activity的生命周期方法
  • activity发生变换,size,orenitation变化等
  • 或者其他引起activity重新调用生命周期的情况
    因为activity会自动尝试恢复之前的UI,并且我们自己又重新调用了一遍业务UI代码,所以会在当前的activity的frament栈再次添加新的fagment,所以出现多重UI重叠的现象

解决方案:


  1. 参考网上给出的方案,在activity的onSaveInstanceState中,不让activity保存UI状态
override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) {
        //super.onSaveInstanceState(outState, outPersistentState)
}
  1. 但是,我发现在有的情况下,还是会出现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()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。