package com.sw.platecabinet.utils import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager class FragmentHelper( private val fragmentManager: FragmentManager, private val containerId: Int ) { /** * 添加Fragment到容器中 * @param fragment 要添加的Fragment * @param addToBackStack 是否添加到返回栈 * @param tag Fragment的标签 */ fun addFragment(fragment: Fragment, addToBackStack: Boolean = false, tag: String? = null) { fragmentManager.beginTransaction().apply { add(containerId, fragment, tag) if (addToBackStack) { addToBackStack(tag) } commit() } } /** * 替换容器中的Fragment * @param fragment 要替换的Fragment * @param addToBackStack 是否添加到返回栈 * @param tag Fragment的标签 * @param animEnter 进入动画 * @param animExit 退出动画 * @param animPopEnter 弹出进入动画 * @param animPopExit 弹出退出动画 */ fun replaceFragment( fragment: Fragment, addToBackStack: Boolean = true, tag: String? = null, animEnter: Int = 0, animExit: Int = 0, animPopEnter: Int = 0, animPopExit: Int = 0 ) { fragmentManager.beginTransaction().apply { if (animEnter != 0 || animExit != 0 || animPopEnter != 0 || animPopExit != 0) { setCustomAnimations(animEnter, animExit, animPopEnter, animPopExit) } replace(containerId, fragment, tag) if (addToBackStack) { addToBackStack(tag) } commit() } } /** * 显示Fragment * @param fragment 要显示的Fragment */ fun showFragment(fragment: Fragment) { fragmentManager.beginTransaction() .show(fragment) .commit() } /** * 隐藏Fragment * @param fragment 要隐藏的Fragment */ fun hideFragment(fragment: Fragment) { fragmentManager.beginTransaction() .hide(fragment) .commit() } /** * 移除Fragment * @param fragment 要移除的Fragment */ fun removeFragment(fragment: Fragment) { fragmentManager.beginTransaction() .remove(fragment) .commit() } /** * 返回上一个Fragment * @return 是否成功返回 */ fun popBackStack(): Boolean { return fragmentManager.popBackStackImmediate() } /** * 返回到指定的Fragment * @param tag Fragment的标签 * @param inclusive 是否包含指定的Fragment */ fun popBackStackTo(tag: String, inclusive: Boolean = false): Boolean { return fragmentManager.popBackStackImmediate( tag, if (inclusive) FragmentManager.POP_BACK_STACK_INCLUSIVE else 0 ) } /** * 获取当前显示的Fragment */ fun getCurrentFragment(): Fragment? { return fragmentManager.findFragmentById(containerId) } /** * 通过tag查找Fragment */ fun findFragmentByTag(tag: String): Fragment? { return fragmentManager.findFragmentByTag(tag) } /** * 清除所有Fragment */ fun clearAllFragments() { // 清除所有回退栈中的Fragment fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) // 清除所有已添加的Fragment fragmentManager.fragments.forEach { fragment -> removeFragment(fragment) } } /** * 检查返回栈是否为空 */ fun isBackStackEmpty(): Boolean { return fragmentManager.backStackEntryCount == 0 } }