141 lines
3.7 KiB
Kotlin
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
|
|
}
|
|
} |