基类
abstract class BaseContainerActivity<B : ViewDataBinding> : BaseActivity<B>() {
private val fragments = mutableListOf<Fragment>()
private var lastFragmentIndex = -1
private var _fragmentCount = 0
override fun initView(savedInstanceState: Bundle?) {
lastFragmentIndex = savedInstanceState?.getInt("lastFragmentIndex", -1) ?: -1
_fragmentCount = fragmentCount
initFragmentList()
if (lastFragmentIndex == -1) {
showFragment(0)
}
}
open fun getFragmentTagFromIndex(index: Int) = "base_fragment_${index}"
fun showFragment(index: Int) {
if (index < 0 || index >= fragments.size) {
return
}
supportFragmentManager.commitNow {
if (lastFragmentIndex >= 0 && lastFragmentIndex < fragments.size) {
hide(fragments[lastFragmentIndex])
setMaxLifecycle(fragments[lastFragmentIndex], Lifecycle.State.STARTED)
}
val current = fragments[index]
if (!current.isAdded) {
add(containerId, current, getFragmentTagFromIndex(index))
}
show(current)
setMaxLifecycle(current, Lifecycle.State.RESUMED)
}
lastFragmentIndex = index
}
abstract val containerId: Int
abstract val fragmentCount: Int
private fun initFragmentList() {
for (index in (0 until _fragmentCount)) {
val fragment: Fragment? =
supportFragmentManager.findFragmentByTag(getFragmentTagFromIndex(index))
if (fragment != null) {
fragments.add(fragment)
} else {
fragments.add(getFragmentFromIndex(index))
}
}
}
fun reInitFragmentList(fragmentCount: Int) {
_fragmentCount = fragmentCount
supportFragmentManager.commitNow {
fragments.forEach {
remove(it)
}
}
fragments.clear()
initFragmentList()
if (lastFragmentIndex == -1) {
showFragment(0)
}
}
fun getCurrentFragments() = fragments.getOrNull(lastFragmentIndex)
abstract fun getFragmentFromIndex(index: Int): Fragment
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("lastFragmentIndex", lastFragmentIndex)
}
}
继承实现
override val containerId: Int
// FragmentContainerView 容器ID
get() = R.id.container
override val fragmentCount: Int
// fragment数量 如果是动态数量直接返回0 然后调用 reInitFragmentList(count)
get() = 3
override fun getFragmentFromIndex(index: Int): Fragment {
return when (index) {
// 根据 index 返回 Fragment实例
}
}