/ 安卓 / 43浏览

FragmentContainerView + Fragment

基类

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实例
        }
    }