如何检查导航目标是否在NavController返回堆栈中?

5

我要查找的是我的Fragment是否已经在后退栈中。

例如,我从Fragment A导航到Fragment B。稍后,我从Fragment B导航到Fragment C。现在,我想在Fragment C中检查后退栈中是否有Fragment A。如果是,则我想弹出所有的片段直到Fragment A,否则我想添加新的Fragment A。

请确保我想在Fragment C中检查Fragment A的可用性。

有没有什么好运?

先行致谢。


我认为Navigation AAC并不是为那种用例而设计的,但是你可以潜在地使用fragmentManager.getFragments()并遍历当前添加的片段。 - EpicPandaForce
2个回答

5
我需要的是判断我的片段是否已经在返回栈中的方法。
使用NavController可以实现此功能。
try {
    val back:NavBackStackEntry = controller.getBackStackEntry(R.id.nav_a)
    Log.d("in_back_stack", back.destination.label.toString())
} catch (ex: IllegalArgumentException){
    Log.d("in_back_stack","no_entry")
}

使用NavController.getBackStackEntry(...)destinationId,您可以轻松地知道片段是否已经在后退栈中。但是使用此方法时要小心。如果在后退栈中找不到destinationId,则该方法将抛出一个IllegalArgumentException

请确保我想在Fragment C中检查Fragment A的可用性。

您可以从任何地方进行检查。您只需要NavController的引用即可。

0
fun NavController.isInBackStack(@IdRes id: Int): Boolean = runCatching {
    getBackStackEntry(id)
}.isSuccess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接