|
|
|
@ -15,6 +15,9 @@ import com.android.base.app.activity.ActivityStatus |
|
|
|
|
import com.android.base.kotlin.javaClassName |
|
|
|
|
import kotlin.reflect.KClass |
|
|
|
|
|
|
|
|
|
/**被此 annotation 标注的方法,表示需要使用 [Fragment] 的全类名作为 [FragmentTransaction] 中相关方法的 flag 参数的实参,比如 add/replace 等*/ |
|
|
|
|
annotation class UsingFragmentClassNameAsFlag |
|
|
|
|
|
|
|
|
|
@JvmOverloads |
|
|
|
|
fun Fragment.exitFragment(immediate: Boolean = false) { |
|
|
|
|
activity.exitFragment(immediate) |
|
|
|
@ -86,6 +89,10 @@ fun <T : Fragment> FragmentManager.findFragmentByTag(clazz: KClass<T>): T? { |
|
|
|
|
return findFragmentByTag(clazz.java.name) as? T |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Fragment 出栈,包括 flag 对应的 Fragment,如果 flag 对应的 Fragment 不在栈中,此方法什么都不做。 |
|
|
|
|
*/ |
|
|
|
|
@UsingFragmentClassNameAsFlag |
|
|
|
|
fun FragmentManager.popBackUntil(flag: String, immediate: Boolean = false) { |
|
|
|
|
if (immediate) { |
|
|
|
|
popBackStackImmediate(flag, FragmentManager.POP_BACK_STACK_INCLUSIVE) |
|
|
|
@ -94,6 +101,10 @@ fun FragmentManager.popBackUntil(flag: String, immediate: Boolean = false) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Fragment 出栈,不包括 flag 对应的 Fragment,如果 flag 对应的 Fragment 不在栈中,此方法什么都不做。 |
|
|
|
|
*/ |
|
|
|
|
@UsingFragmentClassNameAsFlag |
|
|
|
|
fun FragmentManager.popBackTo(flag: String, immediate: Boolean = false) { |
|
|
|
|
if (immediate) { |
|
|
|
|
popBackStackImmediate(flag, 0) |
|
|
|
@ -102,6 +113,26 @@ fun FragmentManager.popBackTo(flag: String, immediate: Boolean = false) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 回到对应的 Fragment,如果 Fragment 在栈中,则该 Fragment 回到栈顶,如果 Fragment 不在栈中,则做一次弹栈操作。 |
|
|
|
|
*/ |
|
|
|
|
@UsingFragmentClassNameAsFlag |
|
|
|
|
fun FragmentManager.backToFragment(flag: String, immediate: Boolean = false) { |
|
|
|
|
val target = findFragmentByTag(flag) |
|
|
|
|
|
|
|
|
|
if (target != null) { |
|
|
|
|
if (isFragmentInStack(target.javaClass)) { |
|
|
|
|
if (immediate) { |
|
|
|
|
popBackStackImmediate(flag, 0) |
|
|
|
|
} else { |
|
|
|
|
popBackStack(flag, 0) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
popBackStack() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun FragmentManager.clearBackStack(immediate: Boolean = false) { |
|
|
|
|
if (immediate) { |
|
|
|
|
this.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) |
|
|
|
@ -110,7 +141,8 @@ fun FragmentManager.clearBackStack(immediate: Boolean = false) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun FragmentManager.isFragmentInStack(clazz: Class<out Fragment>): Boolean { |
|
|
|
|
@UsingFragmentClassNameAsFlag |
|
|
|
|
fun FragmentManager.isFragmentInStack(clazz: Class<out Fragment>): Boolean { |
|
|
|
|
val backStackEntryCount = backStackEntryCount |
|
|
|
|
if (backStackEntryCount == 0) { |
|
|
|
|
return false |
|
|
|
|