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

具有多个顶级目的地的导航图

傅奕
2023-03-14

我在空闲时间实现了一个android应用程序(在Kotlin中,但这与问题无关),我尝试使用android jetpack和新的库。我有一个带有导航抽屉的活动。我试着遵循sunflower应用程序示例。它在主活动中使用以下组合来启用导航抽屉后面的逻辑:

appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
setSupportActionBar(findViewById(R.id.toolbar))
setupActionBarWithNavController(navController, appBarConfiguration)

注意:当在抽屉菜单中单击时,它会自动导航到正确的片段,并关闭抽屉,保持它们被选中等。所有的样板代码。这很整洁,也很有效。据我所知,抽屉菜单项的ID必须与导航图中片段的ID相匹配,这样它们就连接起来了。

我的问题是:当我使用导航抽屉转到导航图的起始片段以外的任何片段时,它将显示一个后退按钮,而不是汉堡包项目。这不是我所期望的,我希望它仍然是汉堡包项目,因为导航抽屉用于在相同级别的视图之间导航,而不是相互嵌套,对吗?如果我通过单击任何片段中的元素(例如list)导航到该片段的子片段,我希望看到一个后退按钮-

现在,我将这个问题追溯到AppBarConfiguration构建器,它读取构造函数上的navgraph,navgraph的起始目标应该被视为唯一的顶级目标 我可以很容易地修复这个问题,方法是覆盖AppBarConfiguration,返回不同的顶级目的地,而不仅仅是导航图的起始目的地。

然而,我的问题是,为什么会有这种默认行为?这是一个错误吗?如果我覆盖它,我会违反谷歌的一些设计准则吗?抽屉菜单中的每个元素不应该和我期望的一样吗?有没有针对我想做的事情的不同解决方案?

共有3个答案

向弘懿
2023-03-14

要获得具有多个顶级目标的工具栏和抽屉的正确行为,可以使用以下代码

val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
val toolbar = findViewById<Toolbar>(R.id.toolbar)
val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout)

/*
Create AppBarConfiguration with set of top level destinations and drawerLayout
Set contains ids of your navigation graph screens
*/
val appBarConfiguration = AppBarConfiguration(
    setOf(R.id.defaultFragment, R.id.firstFragment, R.id.secondFragment), 
    drawer_layout
)

//finally configure toolbar
toolbar.setupWithNavController(navController, appBarConfiguration)

此代码将确保汉堡图标显示在您的所有顶级目的地上,并且当您导航更深时将出现后退按钮。

在这里阅读更多

汲涵育
2023-03-14

我为这个问题举了一个简单的例子。https://github.com/isaul32/android-sunflower

首先创建一组顶级目的地

val topLevelDestinations = setOf(R.id.garden_fragment,
        R.id.plant_list_fragment)
appBarConfiguration = AppBarConfiguration.Builder(topLevelDestinations)
        .setDrawerLayout(drawerLayout)
        .build()

然后像这样重写onSupportNavigateUp函数

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(navController, appBarConfiguration)
}
汤飞羽
2023-03-14

您不必重写AppBarConfiguration。由于版本alpha7,AppBarConfiguration有一个构造函数,其中包含一组用于所有顶级目的地的ID。

Set<Integer> topLevelDestinations = new HashSet<>();
topLevelDestinations.add(R.id.fragment1);
topLevelDestinations.add(R.id.fragment2);
appBarConfiguration = new AppBarConfiguration.Builder(topLevelDestinations)
                                             .setDrawerLayout(drawerLayout)
                                             .build();
NavigationUI.setupActionBarWithNavController(this, 
                                             this.navController,
                                             this.appBarConfiguration);

这不是默认情况,因为导航图只有一个起始片段,它应该始终是应用程序的单个入口点。

使用AppBarConfiguration编辑默认行为不会使其像以前一样,每个顶级片段都放在后堆栈上,因此“后退”按钮将转到所有顶级片段。目前尚不清楚如何将顶层片段作为后堆栈的第一个元素

 类似资料:
  • 当我在导航图中有多个顶级目的地,并且当我点击后退键完成我的应用程序时,除了之外的那些目的地不会完成,而是弹出片段。 FragmentA(开始目的地)- 我试过和/或但徒劳无功。 活动: layout.xml: nav_graph: 我知道重写是一种变通方法。 还有更根本的解决办法吗?

  • 我有一个有两个阶段的Dockerfile;第一阶段从源代码构建一个react应用程序,第二阶段复制构建并添加一个NGINX服务器: 我也在使用gitlab-ci,我希望有多个阶段:构建、测试和部署。但是我不知道如何将构建和测试阶段分开,因为我使用的是多阶段的DockerFile。问题是所有的JS测试(对于React)都需要在“Yarn build”执行之前运行,并且build被复制到seconds

  • 我在导航图中实现了一个嵌套图,它有两个图。在第一个图中,有3个片段,在第二个图中,有2个片段。图2包含在图1中。我想导航到(图1步骤1)到(图2步骤2)。我们不能定义两个嵌套片段之间的动作。那么,有什么方法可以将动态目的地分配给导航? 图1 图2 我已经检查了这个解决方案,但它不适用于嵌套图!

  • 问题内容: 希望这是一个非常简单的问题。我有一个makefile模式规则,如下所示: 我希望makefile生成许多.so文件,因此我尝试通过执行以下操作来使其生成两个文件(radgrd_py.so和lodiso_py.so): 然后尝试这个: 但是在每种情况下,它只会构建我指定的第一个目标。如果我运行’make radgrd_py.so’可以正常工作,我只是不确定如何指定需要构建的文件列表,这样

  • 如何使用多个使用相同库的应用程序创建gradle根项目。我希望以包含以下内容的tar和zip文件结束: 导致错误

  • 我正在处理多个具有内部和外部依赖关系的Gradle项目,到目前为止,我很高兴由于Gradle的依赖关系管理,我可以修改一个库项目,而不会影响使用该库的每个应用程序。 当我需要修改库项目并使用使用它的应用程序项目对其进行测试时,我需要执行以下操作, 修改库项目并提交给SCM 触发CI构建库项目并将其推送到我的Gradle存储库 更新应用程序项目的以引用库项目的新版本 迭代以上步骤,直到一切正常,没有