底部导航视图使用深层链接导航到目的地导致也在第一个选项卡中添加目的地片段

问题描述

假设我们有一个带有 4 个选项卡的底部导航视图,我们有一个包含 4 个选项卡的片段的深层链接,所以当从这个深层链接导航到 4 个选项卡时 - 它应该正常工作,但是之后手动选择第一个选项卡,第一个选项卡中也添加了 4 个选项卡的片段。

  1. 我有一个包含 4 个片段的导航图

  2. 在创建我的活动时,我使用导航控制器设置了底部视图

                navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment
                navController = navHostFragment?.navController
                navController?.setGraph(R.navigation.nav_unauth_state)
                navView.inflateMenu(getBottomNavViewMenu())
                navController?.let {
                    navView.setupWithNavController(it)
                }
    
    
  3. 在此活动的清单中,我添加<nav-graph android:value="@navigation/nav_unauth_state" />

  4. 在 frgament 的 nav_unauth_state 中我设置了深层链接

            android:id="@+id/deepLink2"
            app:uri="https://<my_secret_url>/{action}" />

解决方法

我用这个解决方案自己解决了

navView.setOnItemSelectedListener { menuItem ->
    val builder = NavOptions.Builder().setLaunchSingleTop(true).setRestoreState(false)
    val graph = navController?.currentDestination?.parent
    val destination = graph?.findNode(menuItem.itemId)
    if (menuItem.order and Menu.CATEGORY_SECONDARY == 0) {
        navController?.graph?.findStartDestination()?.id?.let {
            builder.setPopUpTo(
                it,inclusive = false,saveState = true
            )
        }
    }
    val options = builder.build()
    destination?.id?.let { id -> navController.navigate(id,null,options) }
    return@setOnItemSelectedListener true
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...