导航组件:查找片段是否在后堆栈中

时间:2019-11-06 08:23:32

标签: android android-fragments android-architecture-navigation

我试图查找NavHostFragment的backStack中是否已经有一个片段(因此它会自动管理片段事务和backstack),以便当用户从我的侧边菜单中选择该目的地时弹出该片段,而不是向后堆栈中添加另一个新片段。

这很重要:我的许多片段都属于同一类,我们将其称为ArticleListFragment,它们的contentId参数(简单的字符串ID)会更改这些片段中显示的内容。

这意味着我无法使用nav_host_fragment.childFragmentManager.findFragmentById(),因为我在后堆栈中的多个片段具有相同的片段ID。

到目前为止,我尝试过的是

var foundIndex = -1
for (i in 0 until nav_host_fragment.childFragmentManager.backStackEntryCount) {
    val currFragmentTag = nav_host_fragment.childFragmentManager.getBackStackEntryAt(i).name
    val currFragmentId = nav_host_fragment.childFragmentManager.getBackStackEntryAt(i).id
    //val currFragment = nav_host_fragment.childFragmentManager.findFragmentByTag(currFragmentTag) // always returns null
    val currFragment = nav_host_fragment.childFragmentManager.findFragmentById(currFragmentId) // always returns null 

    // currentFragment is null so the check always fails       
    if (currFragment is ArticleListFragment && currFragment.contentId == "a value I need to check") {
        foundIndex = i
        break
    }
}

我做错什么了吗?是否有另一种方法可以检查由Android导航组件添加的片段是否已经在后堆栈中?

1 个答案:

答案 0 :(得分:1)

嗯,我遇到了同样的问题,我不能说这是一个完美的解决方案,但是您可以通过

findNavController()
.backStack
.firstOrNull { it.destination.id == ID_YOU_WANT_TO_CHECK }

backstack实际上是受限制的,因此需要禁止该方法。

@SuppressLint("RestrictedApi")