Navigation

Navigation 是一个框架,用于在 Android 应用中的“目标”之间导航,该框架提供一致的 API,无论目标是作为 Fragment、Activity 还是其他组件实现。

最新更新时间 当前稳定版 下一候选版本 Beta 版 Alpha 版
2019 年 11 月 7 日 2.1.0 2.2.0-rc02 - -

声明依赖项

要添加 Navigation 的依赖项,您必须将 Google Maven 代码库添加到项目中。有关详情,请阅读 Google 的 Maven 代码库

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

    dependencies {
      def nav_version = "2.1.0"

      // Java language implementation
      implementation "androidx.navigation:navigation-fragment:$nav_version"
      implementation "androidx.navigation:navigation-ui:$nav_version"

      // Kotlin
      implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
      implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

    }
    

Safe Args

要将 Safe Args 添加到您的项目,请在顶级 build.gradle 文件中包含以下 classpath

    buildscript {
        repositories {
            google()
        }
        dependencies {
            def nav_version = "2.1.0"
            classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
        }
    }
    

您还必须应用以下两个可用插件之一。

要生成适用于 Java 或 Java 和 Kotlin 混合模块的 Java 语言代码,请将以下行添加到应用或模块build.gradle 文件中:

apply plugin: "androidx.navigation.safeargs"

此外,要生成适用于 Kotlin 独有的模块的 Kotlin 代码,请添加以下行:

apply plugin: "androidx.navigation.safeargs.kotlin"

根据迁移到 AndroidX 文档,您的 gradle.properties 文件 中必须具有 android.useAndroidX=true

如需了解如何使用 Kotlin 扩展,请参阅 ktx 文档

如需详细了解依赖项,请参阅添加编译依赖项

版本 2.2.0

版本 2.2.0-rc02

2019 年 11 月 7 日

发布了 androidx.navigation:navigation-*:2.2.0-rc02版本 2.2.0-rc02 中包含这些提交内容

依赖项变更

  • Navigation 现在依赖于 androidx.lifecycle 2.2.0-rc02

版本 2.2.0-rc01

2019 年 10 月 23 日

发布了 androidx.navigation:navigation-*:2.2.0-rc01,该版本与 2.2.0-beta01 相比没有变化。版本 2.2.0-rc01 中包含这些提交内容

版本 2.2.0-beta01

2019 年 10 月 9 日

发布了 androidx.navigation:navigation-*:2.2.0-beta01版本 2.2.0-beta01 中包含这些提交内容

新功能

  • NavDestination 及其子类现在替换 toString(),以在调试时提供更实用的信息。(b/141264986)

行为变更

  • 现在,匹配深层链接时会忽略其他查询参数,而不是导致匹配失败。(b/141482822)

问题修复

  • 修复了以下问题:如果还指定了查询参数,深层链接路径中的参数将被忽略。(b/141505755)
  • 如果没有额外服务,Activity 上的 navArgs() Kotlin 扩展程序现在具有更明确的错误消息。(b/141408999)
  • Safe Args 生成的 Directions Java 类现在包含默认值。(b/141099045)
  • Safe Args 生成的 Args Java 类现在包含默认值。(b/140123727)
  • 如果使用 Toolbar,在两个顶级目标之间移动时,NavigationUI 不再以动画形式显示文本更改。(b/140848160)

版本 2.2.0-alpha03

2019 年 9 月 18 日

发布了 androidx.navigation:navigation-*:2.2.0-alpha03版本 1.2.0-alpha03 中包含这些提交内容

行为变更

  • 在调用 setGraph 之后调用 setViewModelStore() 现在会导致出现 IllegalStateException。在初始设置中,此项应始终由 NavHost 进行设置,以确保所有 NavBackStackEntry 实例均具有用于 ViewModel 实例的一致存储。(aosp/1111821)

问题修复

  • 修复了在使用 ViewModelStore 实例(附加到多个不同导航图表限定范围的 ViewModel 实例)时出现的 ConcurrentModificationException。(aosp/1112257)

版本 2.2.0-alpha02

2019 年 9 月 5 日

发布了 androidx.navigation:navigation-*:2.2.0-alpha02。点击此处可查看此版本中包含的提交内容。

新功能

  • 具有查询参数的深层链接现在支持重新排序的查询参数;匹配深层链接时,具有默认值或可为 null 的参数现在是可选的。(b/133273839)
  • 您现在可以调用 NavController.getBackStackEntry(),在返回堆栈中传入目标或导航图表的 ID。除了提供用于启动该目标的参数,返回的 NavBackStackEntry 还提供导航驱动的 LifecycleOwnerViewModelStoreOwner(与 NavController.getViewModelStoreOwner() 返回的内容相同)和 SavedStateRegistryOwner。(aosp/1101691aosp/1101710

问题修复

  • 修复了将 NavHostFragment 添加到 ViewPager2 失败并出现 IllegalArgumentException 的问题。(b/133640271)
  • NavInflater 现在可以避免不必要地调用 getResourceName(),从而将扩充时间最多缩短 40%。(b/139213740)

版本 2.2.0-alpha01

2019 年 8 月 7 日

发布了 androidx.navigation:navigation-*:2.2.0-alpha01。点击此处可查看此版本中包含的提交内容。

新功能

  • SavedStateViewModelFactory 现在是将 by navGraphViewModels()ViewModelProvider 构造函数与 NavController.getViewModelStoreOwner() 返回的 ViewModelStoreOwner 一起使用时所用的默认出厂设置。(b/135716331)

API 变更

问题修复

  • NavHostFragment 现在使用 FragmentContainerView,修复了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。(b/137310379)

版本 2.1.0

版本 2.1.0

2019 年 9 月 5 日

发布了 androidx.navigation:navigation-*:2.1.0。点击此处可查看此版本中包含的提交内容。

自 2.0.0 以来的重要变更

  • 将 ViewModel 范围限定为导航图表:您现在可以通过针对使用 -ktx 库的 Kotlin 用户的 by navGraphViewModels() 属性委派或使用添加到 NavControllergetViewModelStoreOwner() API,创建在导航图表级别限定范围的 ViewModel。如需了解详情,请参阅在目标之间共享与界面相关的数据
  • dialog 目标:您现在可以创建 <dialog> 目标,当您 navigate 到这些目标时,系统会显示 DialogFragmentNavHostFragment 默认支持 dialog 目标。如需了解详情,请参阅从 DialogFragment 创建目标
  • 通过 Uri 导航:您现在可以使用 Uri 进行 navigate,它使用您已添加到目标的 <deepLink> 进行导航。如需了解详情,请参阅使用 Uri 导航
  • NavHostController:专门用于构建自定义 NavHost 的 API 已移至 NavHostController,从而允许实现将其 NavController 连接到托管 LifecycleOwnerOnBackPressedDispatcherViewModelStore

版本 2.1.0-rc01

2019 年 8 月 7 日

发布了 androidx.navigation:navigation-*:2.1.0-rc01。点击此处可查看此版本中包含的提交内容。

API 变更

  • 移除了 2.1.0-alpha02 中引入的 NavController 上已弃用的 getViewModelStore() API。(aosp/1091021)

版本 2.1.0-beta02

2019 年 7 月 19 日

发布了 androidx.navigation:*:2.1.0-beta02。点击此处可查看此版本中包含的提交内容。

问题修复

  • 移除了在 2.1.0-beta01 中引入的意外 jacoco 依赖项。(b/137782950)

版本 2.1.0-beta01

2019 年 7 月 17 日

发布了 androidx.navigation:*:2.1.0-beta01。点击此处可查看此版本中包含的提交内容。

新功能

  • setupWithNavController()ToolbarCollapsingToolbarLayout 结合使用时,NavigationUI 现在会以动画形式显示向上按钮的移除。(b/131403621)

问题修复

  • 修复了通过 findNavController() 使用具有相同容器的多个 NavHostFragment 时出现的时间问题。(b/136021571)

版本 2.1.0-alpha06

2019 年 7 月 2 日

发布了 androidx.navigation:*:2.1.0-alpha06。点击此处可查看此版本中包含的提交内容。

新功能

  • NavHostFragment 使用的 app:navGraph 属性现在已移至 navigation-runtime 工件。可通过 XML 添加的自定义导航器应使用此属性与导航编辑器的“托管方”面板相集成。(b/133880955)

API 变更

  • 弃用了 NavController 上的 getViewModelStore() API,转为使用新的 getViewModelStoreOwner() 方法,该方法可返回 ViewModelStoreOwner。(aosp/987010)
  • 浮动窗口目标(例如 <dialog> 目标)的实现已泛化为标记接口 FloatingWindow,现在所有 目标都可以实现该接口。用于与顶部应用栏交互的 NavigationUI 方法现在会忽略 FloatingWindow 目标。(b/133600763)

行为变更

  • Navigation 现在可以正确地使其状态与使用 <dialog> 目标时屏幕上显示的状态保持同步。因此,当您导航到非 dialog 和非 activity 目标(例如 <fragment> 目标)时,Navigation 现在会自动弹出 <dialog> 目标。(b/134089818)

问题修复

  • Navigation 现在可以禁止在处理深层链接时重新创建 Activity 时出现的动画,从而修复了视觉闪烁问题。(b/130362979)
  • 修复了由于添加了初始 Fragment 而弹出 Fragment 时 Navigation 返回堆栈不同步的问题。(b/133832218)

版本 2.1.0-alpha05

2019 年 6 月 5 日

发布了 androidx.navigation:*:2.1.0-alpha05。点击此处可查看此版本中包含的提交内容。

API 变更

  • NavController 上与托管方相关的 API 已重命名并移至 的新子类 NavHostController。(aosp/966091)
  • NavController setHostOnBackPressedDispatcherOwner() 方法替换为 NavHostControllersetOnBackPressedDispatcher()方法,现在要求您在调用该方法之前先调用 setLifecycleOwner()。(aosp/965409)
  • NavHostController 现在包含 enableOnBackPressed(boolean) 方法,该方法替换了先前由 setHostOnBackPressedDispatcherOwner() 返回的 NavHostOnBackPressedManager 类。(aosp/966091)

问题修复

  • 修复了通过 URI 导航后返回堆栈不正确的问题。(b/132509387)
  • NavController 自动处理的深层链接现在仅触发一次。(b/132754763)

版本 2.1.0-alpha04

2019 年 5 月 16 日

发布了 androidx.navigation:*:2.1.0-alpha04。点击此处可查看此版本中包含的提交内容。

问题修复

  • 在拦截系统返回按钮事件时,NavHostFragment 正确遵守 app:defaultNavHost,从而修复了 Navigation 2.1.0-alpha03 中出现的回归问题。b/132077777
  • DialogFragmentNavigator 现在可以正确处理 popBackStack()navigateUp() 操作。b/132576764
  • 修复了在嵌套图表之间反复导航时出现的 IllegalStateException: unknown destination during restore 问题。b/131733658

版本 2.1.0-alpha03

2019 年 5 月 7 日

发布了 androidx.navigation:*:2.1.0-alpha03。点击此处可查看此版本中包含的提交内容。

已知问题

  • 尽管使用了 app:defaultNavHost="false",NavHostFragment 仍继续拦截系统返回按钮 b/132077777

新功能

  • 您现在可以创建 <dialog> 目标,当您 navigate 到这些目标时,系统会显示DialogFragment 目标。NavHostFragment 默认支持 dialog 目标。b/80267254
  • 除了使用资源 ID 或 NavDirections 实例调用 navigate 之外,您现在还可以通过 Uri 进行导航,它使用您已添加到目标的 <deepLink> 导航到相应的目标。b/110412864

行为变更

  • NavigationUI 提供的默认动画已从 400 毫秒缩短到 220 毫秒,以匹配 Activity 和 Fragment 的默认动画速度。b/130055522

API 变更

  • 弃用了 NavHostFragmentcreateFragmentNavigator() 方法,并且其功能已移至新的 onCreateNavController() 方法,以便您更清楚地了解,这是创建子类 时添加自定义导航器的正确入口点。b/122802849
  • hasDeepLink() 方法添加到了 NavDestination,以便检查给定的 Uri 是否可由给定的目标处理,或者在有 NavGraph 的情况下,否可由导航图表中的任何目标处理。b/117437718

问题修复

  • 默认参数现在将正确传递到 OnDestinationChangedListener 实例。b/130630686
  • NavHostFragment 现在使用 OnBackPressedDispatcher 拦截系统返回事件,从而修复了返回到 Fragment 时在 Fragment 生命周期方法中进行条件导航时出现的问题。b/111598096
  • 对于 Safe Args,现在可以将未指定 app:argTypeandroid:defaultValue=”@null” 正确推断为 string 参数。b/129629192

版本 2.1.0-alpha02

2019 年 4 月 3 日

发布了 androidx.navigation:*:2.1.0-alpha02。点击此处可查看此版本中包含的提交内容。

新功能

  • 您现在可以通过针对 Kotlin 用户的 by navGraphViewModels() 属性委托或者通过使用添加到 NavControllergetViewModelStore() API,创建在导航图表级别限定范围的 ViewModel。b/111614463

API 变更

  • 您现在可以将 app:targetPackage 添加到 <activity>,以限制匹配的软件包名称。它支持 app:targetPackage="${applicationId}",可将软件包限制为您自己的应用 ID。b/110975456

问题修复

  • <activity> 目标的 android:name 在扩充时不再解析为类,从而在使用动态功能时避免出现 ClassNotFoundException。b/124538597

版本 2.1.0-alpha01

2019 年 3 月 19 日

这是 Navigation 2.1.0 的第一个 Alpha 版本。

依赖项变更

  • Navigation 现在依赖于 androidx.core:core:1.0.1androidx.fragment:fragment:1.1.0-alpha05。此版本还移除了 androidx.legacy:legacy-support-core-utils:1.0.0 的依赖项。b/128632612

API 变更

  • 新增了 Navigation.createNavigateOnClickListener(NavDirections) 方法,以替代使用资源 ID 和套装创建点击监听器的方法。b/127631752
  • FragmentNavigator.instantiateFragment 现已被弃用。默认实现现在使用 FragmentFactory 实例化 Fragment。b/119054429

问题修复

  • 有附加到目标的参数时,Navigation 不再发送 null Bundle,从而修复了在使用 android:defaultValue="@null" 时出现的问题。b/128531879
  • Safe Args 现在依赖于 KotlinPoet 1.1.0,从而修复了软件包名称过长的问题。b/123654948

版本 2.0.0

版本 2.0.0

2019 年 3 月 14 日

发布了 Navigation 2.0.0,该版本与 2.0.0-rc02 相比没有变化。

版本 2.0.0-rc02

2019 年 3 月 6 日

Navigation 2.0.0-rc02 提供了具有 androidx.navigation 组 ID 的新工件,并将其依赖项更改为 AndroidX 等效项。

2.0.0-rc02 的行为与 Navigation 1.0.0-rc02 的行为相同,除了更新依赖项以匹配新依赖项之外,从 1.0.0-rc02 更新不需要对代码做出任何更改。

项目必须已迁移到 AndroidX 才能使用 Navigation 的 2.X 版本。Navigation 1.0 稳定版将是最后一个使用支持库依赖项的版本;1.0 以后的所有未来开发都将基于 AndroidX,并基于 2.0 稳定版进行编译。

AndroidX 之前版本的依赖项

对于 AndroidX 之前的 Navigation 版本,请添加以下依赖项:

dependencies {
        def nav_version = "1.0.0"

        implementation "android.arch.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
        implementation "android.arch.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
    }
    

对于 Safe Args,在顶级 build.gradle 文件中添加以下类路径

buildscript {
        repositories {
            google()
        }
        dependencies {
            classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
        }
    }
    

版本 1.0.0

版本 1.0.0

2019 年 3 月 14 日

发布了 Navigation 1.0.0,该版本与 1.0.0-rc02 相比没有变化。

版本 1.0.0-rc02

2019 年 2 月 26 日

这是 Navigation 1.0.0 稳定版的第二个候选版本。此版本修复了很多问题。

问题修复

  • 修复了在根图没有 ID 的情况下 popBackStack() 会被忽略的问题 b/126251695
  • 在处理没有 FLAG_ACTIVITY_NEW_TASK 的深层链接后调用 navigateUp() 时,它现在可以正确处理导航回应用的任务 b/126082008
  • 修复了 ActivityNavigator.applyPopAnimationsToPendingTransition 未应用正确的弹出退出动画的问题 b/126237567
  • 由 Safe Args 生成的 Kotlin 代码现在可以正确转义 Kotlin 关键字,例如与 R 类关联的软件包名称中的 infunb/126020455

版本 1.0.0-rc01

2019 年 2 月 21 日

这是 Navigation 1.0.0 稳定版的候选版本。此版本修复了一个问题。

问题修复

  • 修复了使用 Fragment 和 singleTop 导航操作时出现的问题 b/124294805

版本 1.0.0-beta02

2019 年 2 月 12 日

此版本进行了一些微小的改进并修复了一些重要问题。

新功能

  • 您现在可以将 0 用作 reference 参数的 android:defaultValueb/124248602

行为变更

  • 深层链接完全匹配现在优先于使用 .* 或具有匹配参数的深层链接匹配。b/123969518

问题修复

  • 在返回堆栈上弹出最后一个目标时,popBackStack()navigateUp 现在可以正确地返回 false,从而修复了 1.0.0-beta01 中出现的回归问题。b/123933201
  • Navigation 现在可以在恢复已保存实例状态期间正确设置 ClassLoader,从而避免在 Navigator 保存的状态或发送给 NavDestination 的参数中使用自定义类时出现问题。b/123893858
  • 从保存的实例状态恢复 Parcelable[] 参数时,Safe Args 生成的 NavArgs 类不再崩溃。b/123963545
  • Safe Args 现在可以正确清理不必要生成的 Kotlin 类。b/124120883

版本 1.0.0-beta01

2019 年 2 月 4 日

这是 Navigation 的第一个测试版;今后,Navigation API 会在推出下一个版本之前一直保持稳定(除非出现严重问题)。此版本修复了一些问题并更改了一些行为。

行为变更

  • Navigation 现在可以确保在运行时通过 Safe Args 对参数默认值进行相同的处理。因此,仅 app:argType="reference" 的参数可具有指向另一个资源的默认值(例如 @color/colorPrimary)。解析 Navigation XML 时,尝试使用不同 app:argType 的引用默认值会导致出现异常。b/123551990
  • Safe Args 现在依赖于 Android Gradle 插件 3.3.0 aosp/888413
  • Safe Args 现在依赖于 Kotlin 1.3.20 aosp/888414

问题修复

  • 现在,可以在所有版本的 Android Gradle 插件的库和功能模块中使用 Safe Args。b/121304903
  • 修复了导致单个 popBackStack() 操作在返回堆栈顶部弹出目标的所有副本,而不是一次仅弹出一个目标的回归问题。b/123552990
  • 修复了 FragmentNavigator 状态与 NavController 状态不同步,从而在尝试恢复返回堆栈时导致 IllegalStateException 的问题。b/123803044
  • 修复了将 ProGuard 与 obfuscation 一起使用时,NavigationUI 处理的返回箭头不会出现的问题。b/123449431
  • 由 Safe Args 生成的代码现在可以使用指向静态内部类的 app:argType 进行正确处理,静态内部类的格式为 .OuterClass$InnerClassb/123736741
  • 由 Safe Args 生成的 Java 代码现在可以正确处理全局操作和深层嵌套的目标。b/123347762

版本 1.0.0-alpha11

2019 年 1 月 23 日

这是 1.0.0-alpha10 的修补程序版本,修复了 Safe Args 的问题。

问题修复

  • 修复了 Safe Args 无法导入与全局操作关联的 Directions 类的问题。b/123307342

版本 1.0.0-alpha10

2019 年 1 月 23 日

已知问题

  • Safe Args 无法导入与全局操作关联的 Directions 类。b/123307342

此版本包含重大 API 变更,请参阅下面的“重大变更”部分。

新功能

  • Kotlin 用户现在可以使用 by navArgs() 属性委托来延迟获取对 ActivityFragment 中由 Safe Args 生成的 NavArgs 类的引用。b/122603367
  • Safe Args 现在允许您通过应用 androidx.navigation.safeargs.kotlin 插件来生成 Kotlin 代码。Kotlin 代码专为 Kotlin 独有的模块而编译,使用的是默认参数和不可变类,而不是仍可通过之前的 androidx.navigation.safeargs 插件使用的 Builder 模式。b/110263087

行为变更

  • 匹配深层链接现在偏向具有最匹配参数的深层链接。b/118393029
  • NavController 上调用 setGraph() 现在会重置返回堆栈。b/111450672
  • 未知的深层链接不再引发 IllegalStateException,而是会被忽略,从而修复了具有嵌套或多个 NavHostFragment 的问题。b/121340440

重大变更

  • 用于将弹出动画应用于 Activity 的 NavOptions.applyPopAnimationsToPendingTransition() 方法已移至 ActivityNavigatorb/122413117
  • Safe Args 现在可以避免为没有参数的操作复制相同的类。生成的 NavDirections 类中无参数方法的返回类型现在为 NavDirectionsb/123233147
  • Safe Args 生成的 Directions 类不再具有公开构造函数 - 您只应与生成的静态方法进行互动。b/123031660
  • Safe Args 生成的 NavDirections 类不再具有公开构造函数 - 它们只能通过生成的 Directions 类中的静态方法生成。b/122963206
  • NavDirectionsgetArguments() 返回的 Bundle 现在标记为 @NonNull,而不是 @Nullableb/123243957

问题修复

  • NavDeepLinkBuilder 现在可以使用您传入的参数来确定唯一性,从而正确地将多个同时PendingIntent 处理到同一目标。b/120042732
  • 将嵌套的 NavHostFragment 或其他子 Fragment 与返回堆栈一起使用时,NavController 现在可以正确处理 popBackStack() 操作。b/122770335
  • NavigationUI 现在可以正确设置向上按钮的内容描述。b/120395362
  • Safe Args 生成的 Directions 类现在可以正确处理与目标上的操作具有相同 ID 的全局操作。b/122962504
  • equals() 返回 true 时,Safe Args 生成的 NavDirections 类现在可以相应地具有相等的 hashCode() 值。b/123043662
  • 如果尝试对 NavHostFragmentFragmentManager 自定义 FragmentTransactions,则 FragmentNavigator 现在会发出一条更明确的错误消息。应该始终使用 getChildFragmentManager()b/112927148

版本 1.0.0-alpha09

2018 年 12 月 18 日

此版本包含重大 API 变更,请参阅下面的“重大变更”部分。

我们已选择不继续开发 android.arch.navigation:navigation-testing 工件。虽然经证实该工件对 NavController 的内部测试有帮助,但我们仍强烈建议使用其他测试策略,例如模拟 NavController 实例以验证是否已完成正确的 navigate() 调用。2018 年 AndroidDevSummit 的一个 Activity 讲座对此方法进行了详细讨论,我们也在专门针对使用 Navigation 进行测试撰写其他文档。

新功能

  • NavigationUI 方法一起使用时,menuCategory="secondary"MenuItem 将不再弹出返回堆栈。b/120104424
  • AppBarConfiguration 现在允许您设置后备 OnNavigateUpListener 实例,当 navController.navigateUp() 返回 false 时,系统会调用此实例。b/79993862 b/120690961

重大变更

  • <argument>argType="reference" 一起使用时,Navigation 将不再解析引用,而是提供原始资源 ID。b/111736515
  • onNavDestinationSelected() 现在会默认弹回到导航图表的起始目标,使其与 setup 方法保持一致。您可以将 menuCategory="secondary" 添加到 MenuItem 来避免弹出返回堆栈。aosp/852869
  • 生成的 Args 类的 fromBundle() 方法现在接受非 null Bundle,而不是可为 null 的 Bundle aosp/845616

问题修复

  • 参数现在可以从深层链接中正确解析为正确的 argType,而非始终解析为字符串 b/110273284
  • Navigation 现在可以正确导出其公开资源 b/121059552
  • Safe Args 现在可与 Android Gradle 插件 3.4 Canary 4 版及更高版本兼容 b/119662045

版本 1.0.0-alpha08

2018 年 12 月 6 日

此版本包含重大 API 变更,请参阅下面的“重大变更”部分。

新功能

  • 当目标标签与 NavigationUI 方法一起使用时,系统现在会自动将 android:label 中的 {argName} 实例替换为正确的参数 b/80267266
  • Navigation 现在依赖于支持库 28.0.0 b/120293333

重大变更

  • OnNavigatedListener 已重命名为 OnDestinationChangedListener b/118670572
  • OnDestinationChangedListener 现在也传递参数的 Bundle aosp/837142
  • 移除了 app:clearTaskapp:launchDocument 属性及其关联的方法。使用 app:popUpTo 与图表的根目录从返回堆栈中移除所有目标。b/119628354
  • ActivityNavigator.Extras 现在使用 Builder 模式,并添加了设置任何 Intent.FLAG_ACTIVITY_ 标记的功能 aosp/828140
  • NavController.onHandleDeepLink 已重命名为 handleDeepLink aosp/836063
  • 许多不适合子类化的类和方法(如 NavOptionsNavInflaterNavDeepLinkBuilderAppBarConfiguration)已设为 final aosp/835681
  • 移除了弃用的 NavHostFragment.setGraph() 方法 aosp/835684
  • 移除了弃用的 NavigationUI.navigateUp(DrawerLayout, NavController) 方法。aosp/835684
  • Fragment 创建工作已移至 FragmentNavigator,从而可以更轻松地将 Fragment 创建工作委托给 FragmentFactoryb/119054429
  • NavGraphNavigator 的构造函数不再接受 Context aosp/835340
  • NavigatorProvider 现在是一个类,而不是一个接口。由 getNavigatorProvider() 返回的 NavigatorProvider 没有改变其功能。aosp/830660
  • NavDestination.navigate() 已移除。改为在 Navigator 上调用 navigate()aosp/830663
  • Navigator 进行了重大重构,不再需要 OnNavigatorNavigatedListener,而是让 navigate 返回已导航到的 NavDestination
  • Navigator 实例无法再向 NavController 发送弹出事件。考虑使用 OnBackPressedCallback 来拦截按下返回按钮的操作并调用 navController.popBackStack()aosp/833716

问题修复

  • 当目标是 <navigation> 元素时,popUpTo 现在可以一致地工作 b/116831650
  • 修复了在使用嵌套图表时导致出现 IllegalArgumentException 的一些错误 b/118713731 b/113611083 b/113346925 b/113305559
  • <activity> 目标的 dataPattern 属性现在将通过调用 toString() 来填充非字符串参数中的参数 b/120161365

Safe Args

  • Safe Args 支持可序列化对象,包括枚举值。枚举类型可以使用不带类名的枚举文字来设置默认值(例如 app:defaultValue="READ"b/111316353
  • Safe Args 支持所有受支持类型的数组 b/111487504
  • Safe Args 现在会忽略资源目录的子文件夹 b/117893516
  • Safe Args 会视情况添加 @Override 注释 b/117145301

版本 1.0.0-alpha07

2018 年 10 月 29 日

新功能

重大变更

  • navigation-testing-ktx 模块已折叠放入 navigation-testing artifact 中,将不再发布。
  • navigation-testing 工件现在依赖于 Kotlin 标准库。API 已被更改以与 Kotlin 惯例更加一致,但您可以继续将其用于采用 Java 语言编写的测试。
  • 不再支持元数据清单注册的导航图表。b/118355937
  • 操作不能再附加到 <activity> 目标。aosp/785539

问题修复

  • 深层链接现在可以正确解析查询参数。b/110057514
  • Activity 目标现在可以正确应用所有进入和退出动画。b/117145284
  • 修复了使用自定义导航器时在配置更改后发生崩溃的问题。b/110763345

Safe Args

  • Safe args 现在固定依赖于 Android Gradle 插件 3.2.1。b/113167627
  • 现在可以为内部类生成方向。b/117407555
  • 修复了与生成 <include> 图表的方向有关的问题。b/116542123

版本 1.0.0-alpha06

2018 年 9 月 20 日

新功能

API 变更

  • 重大变更:导航器 navigate() 方法现在接受 Navigator.Extras 参数。
  • NavController 的 getGraph() 方法现在为 NonNull b/112243286

问题修复

  • 与来自各个目标的视图一起使用时,NavigationUI.setupWithNavController() 不再泄露视图 b/111961977
  • 现在仅调用一次导航器 onSaveState() b/112627079

Safe Args

  • 导航目标 Directions 类现在会扩展其父级的 Directions 类(如果存在)b/79871405
  • Directions 和 Args 类现在具有实用的 toString() 实现 b/111843389

版本 1.0.0-alpha05

2018 年 8 月 10 日

问题修复

  • 修复了导致返回堆栈行为不正确的错误。b/111907708
  • 修复了生成的 Args 类的 equals() 中的错误。b/111450897
  • 修复了 Safe Args 中的构建错误。b/109409713
  • 修复了从资源标识符到 java 名称的转换问题。b/111602491
  • 修复了 Safe Args 插件中有关为空性的错误消息。
  • 添加了缺少的可为 null 性注释。

版本 1.0.0-alpha04

2018 年 7 月 19 日

Navigation 1.0.0-alpha04 和关联的 Safe Args Gradle 插件包含多项 API 变更、行为变更和问题修复。

API/行为变更

  • NavHostFragment 会始终将当前的 Fragment 设置为主要导航 Fragment,从而确保在弹出外部 NavController 之前弹出子 Fragment 管理器 b/111345778

Safe Args

  • 重大变更app:type 已更改为 app:argType,以避免与其他库(如 ConstraintLayout 2.0.0-alpha1)发生冲突 b/111110548
  • 来自 Safe Args 的错误消息现在可供点击 b/111534438
  • Args 类现在确认 NonNull 属性实际上不是 null b/111451769
  • 向 NavDirections 和 Args 生成的类添加了额外的 NonNull 注释 b/111455455 b/111455456

问题修复

  • 修复了深层链接到 Fragment 目标后系统返回按钮的问题 b/111515685

版本 1.0.0-alpha03

2018 年 7 月 12 日

Navigation 1.0.0-alpha03 和关联的 Safe Args Gradle 插件包含多项 API 变更、行为变更和问题修复。

API/行为变更

  • 为工具栏添加了 NavigationUI.setupWithNavController 方法 b/109868820
  • 为 CollapsingToolbarLayout 添加了 NavigationUI.setupWithNavController 方法 b/110887183
  • 当返回堆栈为空或给定的目标 ID 不在返回堆栈中时,popBackStack() 现在返回 false b/110893637
  • FragmentNavigator 现在会在 FragmentManager 保存状态后忽略导航操作,从而避免出现“在 onSaveInstanceState 后无法执行此操作”的异常 b/110987825

Safe Args

  • 重大变更:操作和参数名称中的非字母数字字符将替换为各自 NavDirections 方法名称中的驼峰式大小写格式
    • 例如,DemoController.index 将变为 setDemoControllerIndex b/79995048
    • 例如,action_show_settings 将变为 actionShowSettings b/79642240
  • 重大变更:默认情况下,现在将参数视为非 null。要允许字符串和 Parcelable 参数具有 null 值,请添加 app:nullable="true" b/79642307
  • 您现在可以采用“123L”的形式对默认值使用 app:type="long" b/79563966
  • 现在支持 Parcelable 参数,并使用 app:type 的完全限定类名。支持的唯一一个默认值是 "@null" b/79563966
  • Args 类现在可实现 equals()hashCode() b/79642246
  • Safe Args 插件现在可以应用于库项目 b/80036553
  • Safe Args 插件现在可以应用于功能项目 b/110011752

问题修复

  • 修复了在 Fragment 生命周期方法期间导航时出现的问题 b/109916080
  • 修复了在多次导航嵌套图表时出现的问题 b/110178671
  • 修复了在将 setPopUpTo 与图表中的第一个目标一起使用时出现的问题 b/109909461
  • 修复了将所有 app:defaultValue 值作为字符串传递的问题 b/110710788
  • 与 Android Gradle 插件 3.2 Beta 01 捆绑在一起的 aapt2 现在为 Navigation XML 文件中的每个 android:name 属性添加了保留规则 b/79874119
  • 修复了在更换默认的 FragmentNavigator 时出现的内存泄露问题 b/110900142

版本 1.0.0-alpha02

2018 年 6 月 7 日

行为变更

  • FragmentNavigator 现在使用 setReorderingAllowed(true)b/109826220

  • Navigation 现在对从深层链接网址解析的参数执行 URLDecode 操作。b/79982454

问题修复

  • 修复了在从 Fragment 生命周期方法调用 Navigation 时出现的 IllegalStateExceptionb/79632233

  • Navigation 现在依赖于支持库 27.1.1 来修复使用动画时的闪烁问题。b/80160903

  • 修复了在使用 defaultNavHost="true" 作为子 Fragment 时出现的 IllegalArgumentExceptionb/79656847

  • 修复了在使用 NavDeepLinkBuilder 时出现的 StackOverflowErrorb/109653065

  • 修复了在导航回嵌套图表时出现的 IllegalArgumentExceptionb/80453447

  • 修复了在使用 launchSingleTop 时 Fragment 重叠的问题。b/79407969

  • Navigation 现在可以为嵌套图表构建正确的合成返回堆栈。b/79734195

  • 使用嵌套图表作为 MenuItem 时,NavigationUI 现在会突出显示正确的项。b/109675998

API 变更

  • 弃用了操作的 clearTask 属性以及 NavOptions 中的关联 API。b/80338878

  • 弃用了操作的 launchDocument 属性以及 NavOptions 中的关联 API。b/109806636

版本 1.0.0-alpha01

2018 年 5 月 8 日

Navigation 可以提供用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01