17

根据github 示例,我正在尝试实现navigation controller具有多个后堆栈的倍数。但是,该示例为每个选项卡使用不同的导航图,这使事情变得容易。在我的情况下,我需要对所有选项卡使用相同的导航图,但起始目的地与导航图中设置的“主目的地”不同。BottomNavigationView

到目前为止,我已经设法修改NavigationExtensions文件以实现所有选项卡的单个导航图,并且我得到了多个navControllers带有自己的后堆栈,但我无法弄清楚如何在不同的目的地启动导航图。

.navigate在获取 navcontroller 时尝试过使用,但由于它尚未连接,因此无法正常工作。关于如何实现这一目标的任何想法?谢谢你。

4

2 回答 2

54

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

  1. XML如果存在,则删除导航上的 app:startDestination
  2. 在您的主要活动的 XML 中,删除标记内的以下字段<fragment>app:defaultNavHost="true"app:navGraph
  3. 在我们的主 Activity 上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);
    
于 2019-07-02T06:30:08.833 回答
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)
于 2020-07-18T12:04:54.463 回答