代码之家  ›  专栏  ›  技术社区  ›  Lucas P.

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

  •  0
  • Lucas P.  · 技术社区  · 4 年前

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

    关键是:我的许多片段都是同一个类,我们称之为 ArticleListFragment ,以及他们的 contentId param(一个简单的字符串id)更改这些片段中显示的内容。

    这意味着我不能使用 nav_host_fragment.childFragmentManager.findFragmentById() 因为backstack中的多个片段具有相同的片段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导航组件添加的片段是否已经在后堆栈中?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Mustafa Ozhan    4 年前

    嗯,我也有同样的问题,我不能说这是一个完美的解决方案,但你可以得到它与

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

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

    @SuppressLint("RestrictedApi")