关于fragment重叠的解决在网上已有许多资料,但是因为项目里给的框架的代码是在MainActivity里就把fragment初始化了,我也懒得大幅度去修改,这里来说一下我投机取巧的做法:
用一个成员变量isDetory记录是否被activity被摧毁了
if (savedInstanceState != null&&mContent==null)
{
isDestory=true
}
这里是我切换fragment的代码,第一个参数是fragment,第二个是fragment的名字,第三个FrameLayout的id。
实际上就是用hashmap,保存他们的信息,避免重复add,mContent保存当前的fragment,mContent为空时就直接add不用hide。
当我们知道activity被摧毁了,isDestory为true,用户点击了别的tab标签,我们就直接replace它,将信息保存到hashmap,isDestory变为false。
fun switchFragment(fragment: Fragment?, simpleName: String, id: Int) {
val manager = supportFragmentManager
val mTransaction = manager.beginTransaction()
if (fragment == null) {
return
}
if (isDestory==true){
fragments.put(simpleName, simpleName)
mTransaction.replace(id, fragment, simpleName)
isDestory==false
}else{
if (mContent == null) {
fragments.put(simpleName, simpleName)
mTransaction.add(id, fragment, simpleName)
} else {
if (fragments.containsKey(simpleName)) {
mTransaction.hide(mContent!!).show(fragment)
} else {
fragments.put(simpleName, simpleName)
mTransaction.hide(mContent!!).add(id, fragment, simpleName)
}
}}
mContent = fragment
mTransaction.commitAllowingStateLoss()
}
屁话说了这么多,其实就是用了replace而已,我却走了许多弯路,看来得认真了解每一行代码的意思。