导航组件,检查片段是否在后堆栈中

时间:2020-04-29 12:46:27

标签: android android-jetpack android-architecture-navigation

使用导航组件时,如何检查片段是否在堆栈中?

我能想到的一件事就是尝试使用

获得NavBackStackEntry
val backStackEntry=findNavController().getBackStackEntry(R.id.courseTrackFeedbackFragment)

在文档中,它说如果目标不在堆栈上,则会抛出IllegalArgumentException。但这看起来像黑客一样,有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

是的,这似乎是今天的唯一方法

try {
   getBackStackEntry(resId)
} catch (ignored: Throwable) {
}

答案 1 :(得分:0)

一个简单的扩展功能:

fun NavController.isFragmentRemovedFromBackStack(destinationId: Int) =
    try {
        getBackStackEntry(destinationId)

        false
    } catch (e: Exception) {
        true
    }

答案 2 :(得分:0)

好像没有别的办法了,这些是我目前使用的扩展

fun NavController.isFragmentInBackStack(destinationId: Int) =
    try {
        getBackStackEntry(destinationId)
        true
    } catch (e: Exception) {
        false
    }

fun Fragment.isFragmentInBackStack(destinationId: Int) =
    try {
        findNavController().getBackStackEntry(destinationId)
        true
    } catch (e: Exception) {
        false
    }

用法

if (isFragmentInBackStack(R.id.myFragment)){
         findNavController().popBackStack(R.id.myFragment,false)
} else {
         val action = MyCurrentFragmentDirections.actionToMyFragment()
         findNavController().navigateSafe(action)
   }