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

Android导航组件:以编程方式从不同于家的目的地开始?

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

    我正在尝试实现一个多重 navigation controller 具有多个后堆栈 BottomNavigationView ,根据 github examples .然而,该示例对每个选项卡使用不同的导航图,这使事情变得简单。在我的情况下,我需要对所有选项卡使用相同的导航图,但起始目的地不同于导航图中设置的“起始目的地”。

    到目前为止,我已经设法修改了 NavigationExtensions 文件,以实现所有选项卡的单一导航图,我得到了多个 navControllers 它们有自己的后台堆栈,但我不知道如何在不同的目的地启动导航图。

    我试过使用 .navigate 当获取导航控制器时,但由于尚未连接,因此无法工作。关于如何实现这一点有什么想法吗?非常感谢。

    0 回复  |  直到 7 年前
        1
  •  55
  •   Alvin Dizon    7 年前

    我们有一个要求,即显示的开始屏幕将取决于用户是否登录,我们所做的是:

    1. 删除导航上的app:startDestination XML 如果存在
    2. 在主活动的XML上,删除 <fragment> 标签: app:defaultNavHost="true" 和 app:navGraph
    3. 关于我们的主要活动 onCreate() ,我们创建了一个 NavGraph 对象:

      NavController navController = Navigation.findNavController(this, R.id.your_nav_hostfragment);    
      NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.your_navigation_xml);
      
    4. 然后,根据需要,您可以使用setStartDestination在NavGraph上设置开始目的地,然后将NavGraph应用于NavController:

          if (condition) {
              navGraph.setStartDestination(R.id.screen1);
          } else {
              navGraph.setStartDestination(R.id.screen2);
          }
          navController.setGraph(navGraph);
      
        2
  •  6
  •   Morteza Rastgoo    6 年前

    我写了两个扩展来完成这项工作。第一个用于更改当前节点中的目标。第二种方法用于多次遍历嵌套图

    _main_graph
     |
     |_nested_graph_1
       |
       |_nested_graph_2  
         |
         |_nested_graph_3
           |
           |_nested_graph_4
             |
             |_change this destination!!!!  
    
    fun NavController.changeNodeDestination(nodeId: Int, destinationId: Int): NavController {
        val graph = graph.findNode(nodeId) as NavGraph
        graph.startDestination = destinationId
        return this
    }
    
    fun NavController.changeNodeDestination(vararg nodeIds: Int, destinationId: Int): NavController {
        var currentNode = graph
    
        nodeIds.forEachIndexed { index, i ->
            currentNode = currentNode.findNode(nodeIds[index]) as NavGraph
        }
        currentNode.startDestination = destinationId
        return this
    }
    

    用法:

            findNavController().changeNodeDestination(
                R.id.navigation_login,
                R.id.nav_change_password,                  // GO two levels inside nested graphs
                destinationId = startDestination
            ).navigate(navID, bundle)
    
    推荐文章