首页 > 解决方案 > Android Navigation Architecture 组件,处理不同的 backstacks

问题描述

我正在寻找导航架构组件,我看到的所有示例都是关于集成了 android 底部菜单的单个 Activity 应用程序,所以我想知道这个组件是否对我的情况有用。我的应用程序看起来像:一个下载一些数据的 SplashActivity,如果一切正常,启动 Main 活动。具有自定义底部导航的 MainActivity,允许用户导航到应用程序的 3 个不同部分(A、B、C),并且在每个部分中,用户可以导航更深的 iside 部分本身:

A部分:FragmentAOne -> FragmentATwo -> FragmentAThree

B部分:FragmentBOne -> FragmentBtwo

C部分:FragmenCOne -> FragmentCTwo -> FragmentCThree

并且在某些情况下,用户可以从其中的某些片段中打开另一个显示全屏 web 视图的活动。

现在,我需要每个部分都独立于其他部分(每个片段都应该有它的 backstack),所以用户可以在 FragmentAThree 内,导航到 FragmentCOne 并返回到 A 部分,仍然留在 FragmentAThree 内。

导航架构组件可以处理这种奇怪的情况吗?

标签: androidandroid-fragmentsandroid-architecture-navigation

解决方案


这可以通过最新的导航组件来实现,您需要像这样设置顶级目的地:

    val drawerLayout : DrawerLayout? = findViewById(R.id.drawer_layout)
    appBarConfiguration = AppBarConfiguration(
            setOf(R.id.FragmentAOne, R.id.FragmentBOne, R.id.FragmenCOne),
            drawerLayout)

可通过全局导航 UI 到达的目的地,例如底部导航或侧边导航,在用户看来都与层次结构的同一顶层相同。因此,它们是顶级目的地。FragmentAOne、FragmentBOne 和 FragmenCOne 在底部导航中,我们希望抽屉图标显示在这两个目的地上,因此它们是顶级目的地。

请注意,起始目的地始终被视为顶级目的地。如果您没有指定顶级目的地的列表,那么唯一的顶级目的地就是您的起始目的地。您可以在文档中了解有关 AppBarConfiguration 的更多信息。

您可以在导航代码实验室https://codelabs.developers.google.com/codelabs/android-navigation中阅读和试验此内容


推荐阅读