Files
SmartPlateCabinet/app/src/main/java/com/sw/platecabinet/utils/FragmentHelper.kt
T
2025-07-18 17:16:00 +08:00

141 lines
3.7 KiB
Kotlin

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