应用场景:Activity中add多个fragment,fragmentA跳到fragmentB,再从B跳到A,此时要销毁fragmentB
1、在添加fragment中给每一个fragment添加一个tag,
/**
* 暂存Fragment
*/
private var mFragment = Fragment()
/**
* 选择Fragment存放
*/
private fun switchContent(to: Fragment?, tag: String) {
if (to != null && mFragment !== to) {
val transaction = supportFragmentManager.beginTransaction()
// 先判断是否被add过
if (!to.isAdded) {
// 隐藏当前的fragment,add下一个到Activity中
transaction.hide(mFragment).add(R.id.layout_fragment, to, tag)
.commitAllowingStateLoss()
} else {
// 隐藏当前的fragment,显示下一个
transaction.hide(mFragment).show(to).commitAllowingStateLoss()
}
mFragment = to
}
}
2、fragment中根据设置的tag获取fragment的实例并且销毁它
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (hidden) {
//当前fragment不可见的时候,销毁它
activity?.supportFragmentManager?.findFragmentByTag("b")?.let {
activity?.supportFragmentManager?.beginTransaction()?.remove(
it
)?.commit()
}
(activity as MainActivity).bFragment=null
} else {
}
}
3、特别注意:
不要在销毁的fragment中直接获取activity的fragment总数,这时候的总数是还没有变化的,测试的时候可以写一个按钮直接获取
activity中fragment的总数
btnremove.setOnClickListener {
var size = supportFragmentManager.fragments.size.toString()
var s= supportFragmentManager.findFragmentByTag("b")==null
Toast.makeText(this, size+s.toString(), 0).show()
}