当前位置: 首页 > 知识库问答 >
问题:

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

易波涛
2023-03-14

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

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

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

共有2个答案

柳才良
2023-03-14

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

_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)
董新觉
2023-03-14

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

>

  • 在导航XML上删除app:startDestination(如果存在)
  • 在主活动的XML中,删除

    NavController navController = Navigation.findNavController(this, R.id.your_nav_hostfragment);    
    NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.your_navigation_xml);
    

    然后,根据您的需求,您可以使用setStartDestation在NavGough上设置开始目的地,然后将NavGough应用到NavController:

        if (condition) {
            navGraph.setStartDestination(R.id.screen1);
        } else {
            navGraph.setStartDestination(R.id.screen2);
        }
        navController.setGraph(navGraph);
    

  •  类似资料:
    • 前几天,我开始注意到我的应用程序中有一些东西,它非常不一致。有时会发生,有时不会。 我正在使用导航组件来处理应用程序中的导航,我开始注意到,有时,当通过操作栏后退按钮或设备后退按钮弹出后退时,它返回到一个不再是起始目的地(或至少不应该是)的片段。 在我的例子中,应用程序在MainFragment中启动,经过身份验证后移动到DashboardFragment。这是一种非常常见的情况。 应用程序中的导

    • 基本上,我有以下导航图: 我想在到达后立即将导航图中的起点更改为(以防止在按下后退按钮时返回到,就像启动屏幕一样)。 这是我的代码: 但是,显然它不工作,它回到后按后退按钮。 我做错了吗?还有其他解决办法吗?

    • BottomBar有4个目的地:ScreenA,ScreenB,ScreenC和ScreenD。 在ScreenA上按下按钮(不是底部栏项)时,我想使用参数转到ScreenB。 导航图 底部栏 到目前为止,单击ScreenA上的按钮会将我导航到ScreenB,但参数值始终为0,因为我永远不会传递在lambda中传递的参数。我使用的是compose_version='1.2.0-alpha04'和"

    • 问题内容: 我知道更多视图控制器(导航栏)的存在将UIView按其高度向下推。我也知道这个高度= 44px。我还发现,这种下推保持了。 因此,除了将其设置为常数之外,如何确定此导航栏的高度? 或者,较短的版本,如何确定我的UIView显示在导航栏的顶部? 灯泡开始点亮。不幸的是,如下所述,我还没有发现纠正问题的统一方法。 我相信我的整个问题都围绕着我的自动调整大小掩码。我得出的结论是,无论是否使用

    • 问题内容: 我一直在寻找这种解决方案已有一段时间,但是没有任何解决方案。例如一个解决方案是 此代码将添加带有“停止”图像的按钮。就像这样,还有其他解决方案,例如“搜索,刷新”等。但是 ,如果我想以编程方式在想要的图像上添加按钮,该怎么办? 问题答案: 自定义按钮图片,未设置按钮框: 您可以使用指定的图像和其他属性来初始化新项目。 检查此Apple文档。参考 UIBarButtonItem具有使用按

    • 问题内容: 我正在尝试使用导航栏(“后退”按钮,标题等)和选项卡栏(底部的工具栏)制作一个应用程序。我使用的是子视图,因此不必担心状态栏,导航栏,标签栏的高度等问题。但是我认为这给我带来了麻烦,因为我似乎无法弄清楚如何设置导航栏和标签栏。 这就是我所拥有的。我究竟做错了什么? AppDelegate.h AppDelegate.m ViewController.h ViewController.m