导航

Navigation 是一个框架,用于在 Android 应用中的“目的地”之间导航,该框架提供一致的 API,无论目的地是作为 fragment、activity 还是其他组件实现。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 6 月 26 日 2.7.7 - 2.8.0-beta04 -

声明依赖项

如需添加 Navigation 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库

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

Groovy

dependencies {
  def nav_version = "2.7.7"

  // 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"

  // Feature module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:$nav_version"
}

Kotlin

dependencies {
  val nav_version = "2.7.7"

  // 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")

  // Feature module Support
  implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version")

  // Testing Navigation
  androidTestImplementation("androidx.navigation:navigation-testing:$nav_version")

  // Jetpack Compose Integration
  implementation("androidx.navigation:navigation-compose:$nav_version")
}

Safe Args

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

Groovy

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

Kotlin

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

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

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

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

plugins {
    id("androidx.navigation.safeargs")
}

此外,如需生成仅适用于 Kotlin 模块的 Kotlin 语言代码,请添加以下行:

Groovy

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

Kotlin

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

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

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

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

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

版本 2.8

版本 2.8.0-beta04

2024 年 6 月 26 日

发布了 androidx.navigation:navigation-*:2.8.0-beta04。版本 2.8.0-beta04 包含这些提交内容

bug 修复

  • Navigation 现在支持使用路径参数中的空字符串进行导航。(Ic5dbdb/339481310
  • 改进了通过 @Serializable(with =...) 在类字段上直接声明的自定义序列化器的错误消息,以阐明目前这是一项不受支持的功能。(I052b0b/341319151
  • SavedStateHandleFactory 测试 API 现在可以在非 Android 测试中使用,但需要 Robolectric 支持使用 Bundle 进行参数解析。(I76cdcb/340966212
  • 修复了在 Compose 中使用类型安全导航来恢复应用终止后恢复状态时发生崩溃的问题。(Ia8f38b/341801005
  • 修复了 Navigation Compose 中的以下问题:取消预测性返回手势后,用户返回的 NavBackStackEntry 永远不会返回到 RESUMED 生命周期状态。这还可确保返回目的地以动画形式正确地返回动画,而不是在滑屏后卡入到位。(I97a0cb/346608857
  • 将预测性返回与 Navigation Compose 结合使用时,弹出的目的地现在将具有正确的 Z 轴顺序,从而在传入目的地上方正确添加动画效果。(I2077bb/345993681

版本 2.8.0-beta03

2024 年 6 月 12 日

发布了 androidx.navigation:navigation-*:2.8.0-beta03。版本 2.8.0-beta03 包含这些提交内容

API 变更

  • CollectionNavType 具有一个新的抽象 emptyCollection() 方法。替换此项以处理作为参数传入的空集合。(Ie4d84b/341723133

bug 修复

  • 添加了有关 NavType.serializeAsValueserializeAsValues 的文档,重点介绍了最终输出应采用 URI 编码。(Ida6bdb/344943214
  • 修复了使用 null CollectionNavType 参数调用 toRoute<T> 时发生崩溃的问题。使用 null CollectionNavType 进行导航时,输出参数将是在 Serializable 类中声明的默认值,如果没有默认值,则是 emptyCollection() 的返回值。(I84158Id630fb/342672856

版本 2.8.0-beta02

2024 年 5 月 29 日

发布了 androidx.navigation:navigation-*:2.8.0-beta02。版本 2.8.0-beta02 包含这些提交内容

bug 修复

  • 修复了将 NavBackStackEntry.toRoute 与可为 null 的自定义 NavType 一起使用时 ClassCastException 崩溃的问题。(I1c29bb/342239473
  • 修复了尝试恢复无法通过当前目的地的 ID 到达的返回堆栈条目时导致的 Navigation 返回堆栈状态恢复问题。由于路线由 ID 提供支持,因此使用路线构建的目的地也会受到影响。这也修复了因调用具有相同底层问题的 clearBackStack() 而导致的崩溃问题。(I423c3b/339908057

版本 2.8.0-beta01

2024 年 5 月 14 日

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

API 变更

  • SavedStateHandle.toRoute() 现在接受自定义参数类型的 typeMap 参数。(Ie39fbb/339026523
  • navigation-testing 添加了一个测试 API,用于根据 Kotlin 可序列化对象创建 SavedStateHandle。(Id4867b/339080702

bug 修复

  • 为 Navigation Kotlin DSL 函数添加了缺失的参数文档。(I26a36

版本 2.8.0-alpha08

2024 年 5 月 1 日

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

Navigation Compose 中的 Safe Args

此功能使用 Kotlin 序列化,让您能够通过类型安全的对象和数据类在导航图中定义目的地:

  // Define a home destination that doesn't take any arguments
  @Serializable
  object Home

  // Define a profile destination that takes an ID
  @Serializable
  data class Profile(val id: String)

  // Now define your NavHost using type safe objects
  NavHost(navController, startDestination = Home) {
      composable<Home> {
          HomeScreen(onNavigateToProfile = { id ->
              navController.navigate(Profile(id))
          })
      }
      composable<Profile> { backStackEntry ->
          val profile: Profile = backStackEntry.toRoute()
          ProfileScreen(profile)
      }
  }

如需了解详情,请参阅 Navigation Compose 的“类型安全”博文

新功能

  • navigation-fragment-compose 工件现在提供 ComposableFragment 中可组合方法的本地 LocalFragment 组合。(If35e5)
  • NavType 现在内置了对 Int、String、Boolean、Float 和 Long 列表的列表支持。(I4b6ddIa914cb/188693139

版本 2.8.0-alpha07

2024 年 4 月 17 日

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

新功能

  • 添加了新的 navigation-fragment-compose 工件,其中包含 NavHostFragmentComposableNavHostFragment 替代方案,可让您将 composable 目的地添加到 Navigation XML 文件中。每个 composable 目的地都必须表示为一个不带参数的顶级 @Composable 方法,该方法的完全限定名称会用作每个目的地上的 android:name 属性。导航到这些目的地之一时,系统会创建一个包含 fragment 以显示可组合内容。(I0ef2eb/265480755

    // In HomeScreen.kt
    @Composable
    fun HomeScreen() {
      // Your Composable content here
    }
    
    // In your navigation.xml
    <composable
      android:id="@+id/home_screen"
      android:name="com.example.HomeScreenKt\$HomeScreen" />
    

API 变更

  • 继续使用基于 Kotlin 序列化的方法在 Navigation Compose 中支持 Safe Args。这些 API 尚未完成,带有 ExperimentalSafeArgsApi 注解标记。在未来的版本中,当整个 API Surface 完成后,将移除此注解。(Iefd95I409c8I5b5acI7e753I960f8I3eabdI8ed5aIed2c9、Ied2c9、Idb2

版本 2.8.0-alpha06

2024 年 4 月 3 日

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

API 变更

  • 已开始在 Navigation Compose 中使用基于 Kotlin 序列化的方法支持 Safe Args。这些 API 尚未完成,带有 ExperimentalSafeArgsApi 注解标记。在未来的版本中,当整个 API Surface 完成后,将移除此注解。(I644e7I98896I2a1c56、24 ]边]] ]]。

bug 修复

  • NavHost 现在使用 Alignment.TopStart 作为默认 contentAlignment 参数。这使其与 AnimatedContent 的默认值一致,并修复了中心转换意外缩放的一些情况。(I09e72b/330111602
  • 在使用 Navigation Compose 时轻击预测性返回手势时,NavHost 现在会正确完成自定义转场,而不是立即完成。(I99017b/327292110

版本 2.8.0-alpha05

2024 年 3 月 20 日

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

新功能

  • 您现在可以直接在 startDestination 路由中向 NavGraphstartDestination 传递参数,而无需依赖于 defaultValue。这也适用于嵌套的 NavGraph startDestinations。(I0e0b5b/109505019b/188693139

API 变更

  • 添加了新的抽象 CollectionNavType<T> 类,它是 NavType<T> 的子类,适用于列表、数组、映射等基于集合的参数。(Ic6d63b/188693139
  • 所有默认的 NavType 数组(IntArrayTypeLongArrayTypeFloatArrayTypeBoolArrayTypeStringArrayType)现在均为 CollectionNavType 类型(Idcf79b/188693139
  • NavType 现在提供了一个新的开放式 valueEquals API,用于确定同一类型的两个值是否相等。(I6cb97b/327229511

bug 修复

  • 深层链接中的查询参数现在允许以大括号的形式括住参数名称(即 {argName})作为基于字符串的 NavTypes 的有效值。这修复了以下问题:对于所有类型,此类值都会被视为无效(或缺少值)。(I18302b/327274038
  • 支持 navigatepopBackStack 等路由的 NavController 函数现在可以正确匹配填充了 NavTypes 数组参数的路由。(Iea805b/327229511

版本 2.8.0-alpha04

2024 年 3 月 6 日

发布了 androidx.navigation:navigation-*:2.8.0-alpha04。版本 2.8.0-alpha04 包含这些提交内容

新功能

  • 现在,您可以在 Navigation Compose 中为过渡指定 SizeTranform,方法是将它们定义为 composable 和/或 navigation 函数的初始化的一部分。(I91062b/296912651

bug 修复

  • 修复了以下问题:在不使用手势的情况下使用“系统返回”时,Compose Navigation 中的 NavHost 无法正确显示转场。(Iceeaeb/325998468

版本 2.8.0-alpha03

2024 年 2 月 21 日

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

API 变更

  • NavBackStackEntry.savedStateHandle 现在标记为 @MainThread,因为它使用的代码仍然需要在主线程上执行。(Ibb988b/299523245

bug 修复

  • 修复了 Navigation 中导致 NavGraph ViewModel 过早 DESTROYED 的问题,因为关联条目的 ViewModel 不是已保存状态的一部分。(Ib6bb7b/317581849

依赖项更新

版本 2.8.0-alpha02

2024 年 2 月 7 日

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

新功能

  • Navigation Compose 现在通过 compose-Animation 中的新 SeekableTransitionState API 支持预测性应用内返回。这样,您就可以使用返回手势通过自定义过渡查看上一个目的地,然后再决定通过已完成的手势提交事务,还是取消。(I8b8e9

版本 2.8.0-alpha01

2024 年 1 月 24 日

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

bug 修复

  • 修复了 BackStackState 泄漏问题,即对一个目的地执行多次 saveState 调用会导致保存多种状态,但只能恢复第一个状态。(I598b0b/309559751
  • 修复了使用 NavigationUI 帮助程序填充应用栏标题时非字符串参数无法正确显示的问题。(#636b/316676794

依赖项更新

外部贡献

  • 感谢 SimonMarquis 解决了使用 NavigationUI 帮助程序填充应用栏标题时非字符串参数的显示问题。

版本 2.7.7

版本 2.7.7

2024 年 2 月 7 日

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

bug 修复

  • Navigation 2.8.0-alpha01 向后移植:修复了 BackStackState 泄漏问题,即对单个 NavBackStackEntry 多次调用 saveState() 将导致保存多个状态,但只能恢复第一个保存的状态。(I598b0b/309559751
  • Navigation 2.8.0-alpha01 向后移植:修复了使用 NavigationUI 帮助程序填充应用栏的标题时无法正确显示非字符串参数的问题。(#636b/316676794

外部贡献

  • 感谢 SimonMarquis 解决了使用 NavigationUI 帮助程序填充应用栏标题时非字符串参数的显示问题。

版本 2.7.6

版本 2.7.6

2023 年 12 月 13 日

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

bug 修复

  • NavGraph equals() 函数现在会正确考虑另一个图的节点,而不仅仅是调用图的节点。这将确保不会再将节点具有不同 ID 的图表视为相等(I401cbb/311414915

版本 2.7.5

版本 2.7.5

2023 年 11 月 1 日

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

性能改进

  • 极大地提升了比较两个图表的效果(无论是在时间和分配数量方面)。这意味着,在内部比较新图和现有图的 setGraph 等调用将速度更快,且跳过的帧更少。感谢 Michalick Z 对我们做出的全面分析,帮助我们做出此改进。(I6ad62
  • NavHost 现在会在第一次组合遍历中渲染起始目的地,而无需等待第二次组合读取更新后的状态。(I439a7b/304852206

bug 修复

  • 修复了以下问题:仅当图表中的某个目的地包含链接两个目的地的操作时,您使用完全相同的图表多次调用 setGraph 时,才会弹出返回堆栈。(Ieaed7
  • 连续快速导航到和关闭的对话框不会再泄露到 NavController.visibleEntries 列表中。(I67586b/287969970
  • 现在,如果弹出条目并更改配置,当 saveState 为 false 时,条目的 ViewModel 现在可以正确清除。(Idf242b/298164648
  • 修复了以下问题:如果在配置更改之前返回堆栈完全为空,或者仅在传入 intent 设置了 FLAG_ACTIVITY_NEW_TASK 标志时调用 setGraphNavController 可能会多次处理同一深层链接。(I73c7f

依赖项更新

  • 使用 fragment 进行导航现在依赖于 Fragment 1.6.2,从而修复了在调用 clearBackStack 时无法清除嵌套 fragment 的 ViewModel 实例的问题。

版本 2.7.4

版本 2.7.4

2023 年 10 月 4 日

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

新功能

  • 添加了对 popUpTo 的支持,以便使用带实参的路由,从而允许弹回到使用这些确切实参的特定条目,这与 popBackStack 中的支持一致。(I731f4b/299255572

bug 修复

  • 修复了以下问题:使用 popUpTo 中断导航时另一次导航会导致 FragmentNavigator 崩溃。(I3c848b/301887045
  • 修复了按系统返回按钮导致 currentDestination 无法正确更新以与显示的 fragment 匹配的问题。(Id0d6cb/289877514
  • 现在,当上方的对话框关闭时,DialogFragment 生命周期会正确地变为 RESUMED 状态。(I88f0db/301811387

版本 2.7.3

版本 2.7.3

2023 年 9 月 20 日

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

bug 修复

  • 修复了包含 fragment 的 Navigation 中导致 visibleEntries 列表包含错误条目的问题。(I5caa9b/288520638
  • 修复了导致浮动窗口目的地(即 DialogsBottomsheets 等)始终无法获得 RESUMED 生命周期回调的问题。(I3b866b/287505132

版本 2.7.2

版本 2.7.2

2023 年 9 月 6 日

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

bug 修复

  • Navigation 现在依赖于 Lifecycle 2.6.2,修复了 rememberSaveable 与 Navigation Compose 的 NavHost 之间的交互,该交互会导致在进程终止和重新创建后正确恢复目的地的 rememberSaveable 状态和任何 ViewModel 拥有的 SavedStateHandle 实例。(b/298059596b/289436035
  • 修复了在 Navigation Compose 中同时显示多个对话框时,部分被遮盖的对话框(例如,不是最顶部的对话框)处于 CREATED Lifecycle 状态而非 STARTED 状态的问题。(aosp/2728520b/289257213
  • 修复了在 Navigation Compose 中同时显示多个对话框的问题:关闭最顶层的对话框会导致新的最顶层对话框卡在 STARTED Lifecycle 状态,而不是正确移动到 RESUMED。(aosp/2629401b/286371387
  • 如果实际未执行其任务,Navigation Safe Args 将不再急于实例化其任务。(I0e385b/260322841

依赖项更新

  • Navigation Compose 现在依赖于 Compose 1.5.1。

版本 2.7.1

版本 2.7.1

2023 年 8 月 23 日

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

bug 修复

  • 修复了 Compose 的 Navigation 中的问题:使用 Scaffold 时,在尝试访问 Lifecycle.State.DESTROYED ViewModel 时可能会出错。(I1dc11b/268422136

版本 2.7.0

版本 2.7.0

2023 年 8 月 9 日

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

自 2.6.0 以来的重要变更

Accompanist 的动画

现在,AnimatedContent 已稳定,我们能够将代码从 Accompanist Navigation Animation 移回 Navigation Compose 本身。

这意味着,AnimatedNavHost 中存在的所有对设置自定义转场的支持都在 NavHost 中直接受支持。

不会对 Accompanist Navigation Animation 进行任何其他更改,我们很快就会正式弃用它,并提供有关如何迁移回 Navigation Compose 本身的指南,但这与迁移指南相反,如果您已经使用最新的 Accompanist Alpha 版 (0.31.2-alpha),则不需要进行其他 API 更改。(b/197140101)

bug 修复

  • 现在,Navigation Compose 中的 NavHost 可以正确拦截系统返回调用,即使 activity 已 STOPPED 并处于 RESUMED 状态也是如此。(Icb6deb/279118447

依赖项更新

  • Navigation 现在依赖于从 1.1.0 开始的 Compose 1.5.0

版本 2.7.0-rc01

2023 年 7 月 26 日

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

bug 修复

  • 修复了以下问题:即使 NavHost 从组合中移除,作为 NavHost 的一部分创建的 EnterTransitionExitTransition lambda 也可能会保留在内存中。(I893d0

已知问题

  • Navigation 2.6.x 中存在一个问题,即在使用 popUpTo 进行导航时可能会导致 IllegalArgumentException。您可以参照此处的建议,通过重组您的图表来避免这种异常。(b/287133013)

版本 2.7.0-beta02

2023 年 6 月 28 日

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

bug 修复

  • 对于通过 popUpTo 选项进行导航的自定义转场,Navigation Compose 现在具有正确的 Z 轴顺序。(/Ib1c3ab/285153947

版本 2.7.0-beta01

2023 年 6 月 7 日

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

bug 修复

  • 现在,Navigation Compose 中的 NavHost 会正确拦截系统返回调用,即使 Activity 已变为 STOPPEDRESUMED 也是如此。(Icb6deb/279118447

版本 2.7.0-alpha01

2023 年 5 月 24 日

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

Accompanist 的动画

现在,AnimatedContent 已稳定,我们能够将代码从 Accompanist Navigation Animation 移回 Navigation Compose 本身。

这意味着,AnimatedNavHost 中存在的所有对设置自定义转场的支持都在 NavHost 中直接受支持。

不会对 Accompanist Navigation Animation 进行任何其他更改,我们很快就会正式弃用它,并提供有关如何迁移回 Navigation Compose 本身的指南,但这与迁移指南相反,如果您已经使用最新的 Accompanist Alpha 版 (0.31.2-alpha),则不需要进行其他 API 更改。(b/197140101)

bug 修复

  • Navigation 2.6.0-rc02 开始:修复了 fragment 中的 Navigation 的问题,即使用 popUpTo 进行导航并在不重新创建其视图的情况下从返回堆栈中弹出 fragment 会导致系统返回停止工作。(Ieb8d4b/281726455

依赖项更新

  • Navigation 现在依赖于 Compose 1.5.0-beta01

版本 2.6.0

版本 2.6.0

2023 年 6 月 7 日

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

自 2.5.0 以来对 Navigation 的重要变更

  • NavBackStackEntryarguments 和传递给 OnDestinationChangedListenerarguments 现在只是您在导航到目的地时创建的不可变参数的副本。这意味着,对这些 Bundle 所做的任何更改都不会反映在对 arguments 或其他 OnDestinationChangedListener 实例的后续访问中。
  • 现在,NavDeepLink 支持数组默认值,从而支持有重复的查询参数映射到参数数组类型。NavType 现在还包含一个默认方法,您可以替换该方法,以合并两个已解析的值。
  • NavType 的自定义子类现在可以替换 serializeAsValue,以将值序列化为字符串,从而允许(通过 parseValue)将序列化和反序列化对象完全封装在 NavType 类中。StringType 现在替换了此方法,对指定的 String 调用 Uri.encode

自 2.5.0 以来,Navigation Compose 的重要变更

  • 预览使用 NavHost 的可组合项时,它现在会默认显示 NavGraph 的 startDestination
  • NavController.popBackStack(route)NavController.getBackStackEntry(route)NavController.clearBackStack(route) 现在都支持包含部分或全部填充的参数的路线。请注意,参数必须与条目的参数完全匹配。
  • 现在,如果尝试使用 navDeepLink Kotlin DSL 创建空 NavDeepLink,将会导致 lint 警告,指出深层链接需要 uri、操作和/或 MIME 类型才有效。

自 2.5.0 以来,使用 Fragment 进行导航的重要变更

  • NavHostFragment 不再拦截系统返回按钮本身。这样,底层 FragmentManager 就可以处理系统返回。这样,Fragment 1.7.0-alpha01 及更高版本便可在 Android U 设备上提供应用内预测性返回动画。
  • 将 Navigation 与 fragment 搭配使用时,尝试手动执行将 fragment 添加到 FragmentManager 的返回堆栈的 FragmentTransaction 现在会抛出 IllegalArgumentException。您应始终通过 navigate() API 添加 fragment。
  • 在导航 XML 文件的 activity 元素中使用确切字符串 ${applicationId} 作为 app:dataapp:dataPattern 属性中的占位符时,系统会在膨胀时自动使用上下文的 packageName 填充该占位符。
  • 在导航和弹出 NavBackStackEntries 时,FragmentNavigator 现在使用转换 API。这意味着,NavBackStackEntry Lifecycle 现在会等待进入和退出 fragment 特效完成,然后再移动其最终的 Lifecycle.State
  • 在导航和弹出 NavBackStackEntries 时,DialogFragmentNavigator 现在使用转换 API。这意味着,NavBackStackEntry Lifecycle 现在会等待 DialogFragment Lifecycle 移至 DESTROYED,然后再移至 DESTROYED 本身。
  • NavHostFragment 现在允许您在 NavHostFragment 附加到 FragmentManager 后立即检索 NavController,而不是只能在 onCreate() 之后检索。
  • Navigation 对动态功能模块的支持现在取决于精细的 Play Feature Delivery 库。
  • Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与 7.3.0 及更高版本兼容。

自 2.5.0 以来,NavigationUI 的重要变更

  • 将导航图的 ID 传递给 AppBarConfiguration(例如通过 Menu)时,NavigationUI 现在只会将该导航图的起始目的地视为顶级目的地,而不会错误地将导航图内的每个目的地标记为顶级目的地。传递单个目的地的 ID 这种行为保持不变。通过 AppBarConfiguration 上的新 isTopLevelDestination 函数,您自己的代码也可使用同样的功能。
  • NavigationUI 中用于与顶部应用栏配合使用的 setupWithNavController 集成现在会将 android:label 中找到的 ReferenceType 参数的 R.string 值解析为其字符串值,而不是输出自动生成的资源整数。
  • 现在,当未能通过所选 MenuItem 导航时,NavigationUI 会提供日志。

版本 2.6.0-rc02

2023 年 5 月 24 日

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

bug 修复

  • 修复了 fragment 中的 Navigation 存在的问题:使用 popUpTo 进行导航,并在不重新创建其视图的情况下从返回堆栈中弹出 fragment,会导致系统返回停止工作。(Ieb8d4b/281726455

版本 2.6.0-rc01

2023 年 5 月 10 日

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

bug 修复

  • 修复了 Navigation 中的 fragment 问题:在 fragment 的 onResume() 生命周期回调中使用 popUpTo 进行导航移除 fragment 时,会导致 IllegalStateException。(I21884b/279644470

版本 2.6.0-beta01

2023 年 4 月 19 日

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

新功能

  • NavBackStackEntry 现在提供自定义 toString 实现。(Iff00b)

bug 修复

  • 将 Navigation 与 fragment 搭配使用时,尝试手动执行将 fragment 添加到 FragmentManager 的返回堆栈的 FragmentTransaction 现在会抛出 IllegalArgumentException。您应始终通过 navigate() API 添加 fragment。(I6d38e
  • 现在,如果有一个用于在同一帧中添加条目的 navigate 和用于移除该条目的 popBackStack,返回堆栈上生成的顶部条目现在将始终回到 RESUMED Lifecycle.State。(Id8067b/276495952

版本 2.6.0-alpha09

2023 年 4 月 5 日

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

bug 修复

  • 修复了对无效路线的检查,因此,如果 NavDestination 包含不可为 null 的 NavArgument,此目的地的路线必须包含与不可为 null 的 NavArgument 同名的参数占位符。(Ic62bfb/274697949
  • 现在,如果导航操作缺少与 Action/MimeType 匹配的 NavDestination 所需的不可为 null 的 NavArgument,基于 Action/MimeType 的深层链接导航将会失败。(Ibfa17b/271777424
  • NavController 设置与上一个图表具有相同路线和目的地的图表时,它现在会正确地将其当前图表节点及其返回堆栈目的地替换为新实例。这修复了在 Navigation Compose 中未保存状态的情况下使用 onLaunchSingleTop 时发生崩溃的问题。这也修复了导航到与根图构建关联的目的地和错误返回堆栈的错误。(I5bc58b/275258161b/275407804

版本 2.6.0-alpha08

2023 年 3 月 22 日

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

新功能

  • NavHostFragment 现在允许您在 NavHostFragment 附加到 FragmentManager 后立即检索 NavController,而不是只能在 onCreate() 之后检索。(Ic6382b/220186282

bug 修复

  • 修复了在弹出包含不可为 null 参数的嵌套图时出现的 NullPointerException。(6b3581b/249988437
  • 在使用 popUpTo 执行导航后使用系统返回时,NavController 的状态将弹出到正确的条目。(I3a8ecb/270447657
  • 现在,如果通过系统返回或 popBackStack() 弹出返回堆栈,以及事务是否对 fragment 使用效果,FragmentNavigator 会正确弹出条目。(I81bdf
  • 在不使用导航的情况下将 fragment 添加到 FragmentNavigatorFragmentManager 不会再导致崩溃。(b17204b/274167493

依赖项更新

版本 2.6.0-alpha07

2023 年 3 月 8 日

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

bug 修复

  • 接受路由的 getBackStackEntrypopBackStackclearBackStack API 变体现在采用具有可为 null 的参数和可为 null 的查询参数的路由模式(I22294b/269302500
  • 修复了从 NavController 调用 clearBackStack() 时,无法清除与已清除的返回堆栈关联的 fragment 管理器中的已保存状态的问题。(Ic1cceb/271190202
  • 修复了 2.6.0-alpha06 中的一个回归问题,该问题会导致在标签页之间使用系统返回时突出显示 BottomNavigationView 中的错误 MenuItem。(I634f6b/270447657
  • 修复了 2.6.0-alpha06 中导致在使用 Animation 时不将 NavBackStackEntry 转变为 RESUMED 状态的回归问题。(Ib3589b/269646882

版本 2.6.0-alpha06

2023 年 2 月 22 日

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

新功能

  • 预览使用 NavHost 的可组合项时,它现在会默认显示 NavGraph 的 startDestination。(I2b89f

API 变更

  • 所有 NavController navigate 过载现在都带有 @MainThread 注解,以确保在主线程上调用它们。(I2c0b0b/263427111

bug 修复

  • 修复了使用动态 Fragment 导航时尝试导航时发生崩溃的问题。(I3ee29b/268360479
  • 修复了通过系统返回按钮导航到另一个 fragment 时无法将底部栏更新为正确选定项的 bug(If559fb/269044426

已知问题

  • 将 Navigation 与 Fragment 搭配使用时,使用 Animation API 时,NavBackStackEntry 的生命周期无法到达 RESUMED。(b/269646882)
  • 在将 Navigation 与 Fragment 搭配使用时,以及使用 BottomNavigation 进行导航时,如果您尝试恢复包含多个条目的返回堆栈,BottomMenuItem 无法正确更新。(b/270447657)
  • 将 Navigation 与 Fragment 搭配使用时,恢复状态后,NavBackStackEntry Lifecycle 在其 fragment 为 DESTROYED 时不会获得 DESTROYED。(b/270610768)

版本 2.6.0-alpha05

2023 年 2 月 8 日

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

新功能

  • NavController.popBackStack(route)NavController.getBackStackEntry(route)NavController.clearBackStack(route) 现在都支持包含部分或全部填充的参数的路线。请注意,参数必须与条目的参数完全匹配。(Iebd28Ic678cI3b37bb/257514373
  • 在导航和弹出 NavBackStackEntries 时,FragmentNavigator 现在使用转换 API。这意味着,NavBackStackEntry Lifecycle 现在会等待进入和退出 fragment 特效完成,然后再移动其最终的 Lifecycle.State。(I3cb19b/238686802
  • 在导航和弹出 NavBackStackEntries 时,DialogFragmentNavigator 现在使用转换 API。这意味着,NavBackStackEntry Lifecycle 现在会等待 DialogFragment Lifecycle 移至 DESTROYED,然后再移至 DESTROYED 本身。(I53ee5b/261213893

API 变更

  • NavigatorState 现在提供 prepareForTransition API,以允许 NavigatorNavBackStackEntries 移至中间 Lifecycle.State。(I42c21b/238686802
  • 您现在可以通过 backstack 属性访问与 NavGraphNavigatorComposeNavigator 关联的返回堆栈。ComposeNavigator 现在还公开 onTransitionComplete() 回调,将执行导航或 popBackStack 操作的 NavBackStackEntry 标记为完成。(I02062I718dbb/257519195

bug 修复

  • 现在,在使用 push/popWithTransition API 并且条目已在处理时,导航器状态将为空操作。(Iadbfab/261213893
  • launchSingleTop 与嵌套的 NavGraph 搭配使用时,从原始目的地到其 startDestination 的所有目的地都将仅正确添加到返回堆栈的顶部。(Id4beab/253256629
  • 现在,导航到同一目的地并将 launchSingleTop 标志设置为 true 时,Navigation 会正确替换 DialogFragment 实例。(I45b5ab/149572817
  • 使用长度正好为 19 个字符的参数时,Navigation SafeArgs 不会再导致编译错误。(Id60bcb/257110095

版本 2.6.0-alpha04

2022 年 11 月 9 日

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

新功能

  • NavType 的自定义子类现在可以替换 serializeAsValue,以将值序列化为字符串,从而允许(通过 parseValue)将序列化和反序列化对象完全封装在 NavType 类中。StringType 现在替换了此方法,对给定的 String 调用 Uri.encode。(Ie5213b/247637434
  • 现在,如果 NavigationUI 无法通过所选 MenuItem 进行导航,它会提供日志。(I2af5ab/247730357

bug 修复

  • 导航深层链接现在会被延迟解析,而不会在图表初始化时解析,这可以提升应用在启动时的性能。(Iab0ab)
  • 修复了以下问题:在深层链接到具有默认 null 参数的目的地后,向上层导航会导致崩溃。(I51c24b/243183636

依赖项更新

  • Navigation 对动态功能模块的支持现在依赖于精细的 Play Feature Delivery 库。(Ib4ddc)
  • Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与版本 7.3.0 及更高版本兼容。(I47e49)

版本 2.6.0-alpha03

2022 年 10 月 24 日

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

bug 修复

  • Navigation 2.5.3 起:当 Crossfade 没有可用于组合的目的地时,NavHost 将不会再导致 NoSuchElementException。现在它只会跳过组合操作。(Ieb46eb/253299416
  • Navigation 2.5.3 起:修复了当目的地从返回堆栈中弹出时,系统仍记得已保存的 Compose 状态(例如,rememberSaveable 使用情况)而不移除此状态的问题。(I64949)

依赖项更新

版本 2.6.0-alpha02

2022 年 10 月 5 日

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

行为变更

  • 将导航图的 ID 传递给 AppBarConfiguration(例如通过 Menu)时,NavigationUI 现在只会将该导航图的起始目的地视为顶级目的地,而不会错误地将导航图内的每个目的地标记为顶级目的地。传递单个目的地的 ID 这种行为保持不变。您也可以通过 AppBarConfiguration 中的新 isTopLevelDestination 函数对自己的代码使用这一功能。(Ie936eb/238496771

bug 修复

  • navigation:navigation-fragment 组件现在依赖于 Fragment 版本 1.5.2。(I00ba4)
  • 导航到 FloatingWindow 目的地(例如对话框)时,所选菜单项将不再更新。(I4cde8b/240308330

版本 2.6.0-alpha01

2022 年 9 月 7 日

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

新功能

  • 现在,NavigationUI 中用于处理顶部应用栏的 setupWithNavController 集成会将 android:label 中的 ReferenceType 参数的 R.string 值解析为字符串值,而不是输出自动生成的资源整数值。(I5f803b/167959935
  • 现在,NavDeepLink 支持数组默认值,从而支持有重复的查询参数映射到参数数组类型。现在,NavType 还包含一个默认方法,您可以替换该方法以合并两个解析值。(Id68c3b/209977108
  • 在导航 XML 文件的 activity 元素中使用确切字符串 ${applicationId} 作为 app:dataapp:dataPattern 属性中的占位符时,系统会在膨胀时自动使用上下文的 packageName 填充占位符。(Iaabdeb/234223561
  • 现在,尝试使用 navDeepLink Kotlin DSL 创建空 NavDeepLink 会导致 lint 警告,指出深层链接需要 uri、action 和/或 mimetype 才能有效。(I08d2fb/154038883

API 变更

  • 添加了新的 NavDestination 扩展函数,用于将包含 android:label="{arg}" 形式的参数的动态标签解析为字符串。通过将 R.string 值解析为字符串值来支持 ReferenceType 参数。(I07d89b/236269380

行为变更

  • 现在,NavBackStackEntry 的 arguments 和传递给 OnDestinationChangedListenerarguments 只是您在导航到目的地时创建的不可变参数的副本。这意味着,对这些 Bundle 所做的任何更改都不会反映在对 arguments 或其他 OnDestinationChangedListener 实例的后续访问中。(I676f5)

bug 修复

  • Navigation 2.5.2 开始:现在,动态导航栏在导航到其他模块中的 Activity 目的地之前,会先正确地尝试安装这些目的地。(Ia2c16b/240292838
  • Navigation 2.5.2 开始:现在,导航到同一目的地并将 launchSingleTop 标志设置为 true 时,Navigation 会正确替换 fragment 实例。(I5a2f1b/237374580
  • Navigation 2.5.2 开始:修复了因导航到双重嵌套图(其与新弹出的起始目的地共用一个父级)而引起的 IllegalStateException。(I9f7cbb/243778589

版本 2.5

版本 2.5.3

2022 年 10 月 24 日

发布了 androidx.navigation:navigation-*:2.5.3版本 2.5.3 中包含以下提交内容

bug 修复

  • Crossfade 没有可用于组合的目的地时,NavHost 将不会再导致 NoSuchElementException。现在它只会跳过组合操作。(Ieb46eb/253299416
  • 修复了当目的地从返回堆栈中弹出时,系统仍记得已保存的 Compose 状态(例如,rememberSaveable 使用情况)而不移除此状态的问题。(I64949)

Version 2.5.2

2022 年 9 月 7 日

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

bug 修复

  • 现在,动态导航栏在导航到其他模块中的 Activity 目的地之前,会先正确地尝试安装这些目的地。(Ia2c16b/240292838
  • 现在,导航到同一目的地并将 launchSingleTop 标志设置为 true 时,Navigation 会正确替换 fragment 实例。(I5a2f1b/237374580
  • 修复了因导航到双重嵌套图(其与新弹出的起始目的地共用一个父级)而引起的 IllegalStateException。(I9f7cbb/243778589

依赖项更新

版本 2.5.1

2022 年 7 月 27 日

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

bug 修复

  • 使用保存在 Bundle 中的自定义参数类型时,Navigation Safe Args 将不会再在生成的类中导致废弃警告。(Id86edb/237725966

依赖项更新

版本 2.5.0

2022 年 6 月 29 日

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

自 2.4.0 以来的重要变更

  • CreationExtras 集成 - Navigation 现在可以通过 Lifecycle 2.5.0CreationExtras 提供无状态 ViewModelProvider.Factory

Navigation SafeArgs

  • Navigation Safe Args 已将 Android Gradle Plugin 依赖项升级为依赖于 7.0.4,从而不需要与 7.0 之前的 AGP 版本兼容。
  • 添加了对要使用的命名空间 build.gradle 属性(而非 applicationId)的支持。

其他更改

  • visibleEntries API 不再处于实验阶段,它提供了一个函数来检索根据 NavController 其目的地当前可见的所有条目。

版本 2.5.0-rc02

2022 年 6 月 15 日

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

bug 修复

  • 修复了使用 Navigation Compose NavHost 在底部目的地之间快速切换导致的崩溃问题。(I3979ab/234054916
  • 使用 applicationIdSuffix 和命名空间但不存在 applicationId 时或当 applicationId 和命名空间不同时,Navigation SafeArgs 不再崩溃。(I754b1b/233119646
  • NavArgument 现在有一个自定义 toString() 函数,用于显示实参的内部值。(I900a8)

版本 2.5.0-rc01

2022 年 5 月 11 日

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

新功能

  • 添加了新的 Lint 规则,以便针对在 navigation.xml 文件内将 <deeplink> 元素置于 <activity> 元素内的情况发出警告。(Ic15a5b/178403185

bug 修复

  • 现在,系统会按照预期顺序处置 NavHostDialogHost 中的可组合项范围,即先处理内部可组合项,然后再处理外部可组合项。(I157e6)
  • Navigation SafeArgs 现在使用 ArgumentsGenerationTask 中的 PathSensitivity.RELATIVE 来支持缓存可再定位性。这意味着现在可以在本地 build 中重复使用 CI build 中的缓存条目。(I5f67cb/173420454
  • 更新了 UnrememberedGetBackStackEntryDetector lint 规则,以确保围绕 getBackStackEntry() 调用的 remember 调用还会将 NavBackStackEntry 对象作为键进行传入。(Ib7081b/227382831

版本 2.5.0-beta01

2022 年 4 月 20 日

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

bug 修复

  • DialogNavigator 现在会使用 popWithTransition 来执行 dismiss() 调用。这修复了在 dialog 目标中使用 ViewModel 时导致竞态条件的问题,该问题会导致使用系统返回机制或点按对话框以外的任意位置关闭对话框时出现 IllegalStateException。(Id7376b/226552301

依赖项更新

  • Navigation 现在依赖于 Lifecycle 2.5.0-beta01,修复了在使用多个返回堆栈时,将非主要底部导航标签页中的一个 NavHost 嵌套在另一个 NavHost 内会导致 IllegalStateException 的问题。

版本 2.5.0-alpha04

2022 年 4 月 6 日

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

API 变更

bug 修复

  • NavHost 现在依赖于 NavController 中的 visibleEntries 来确定要组合的条目。这意味着,在使用嵌套 NavHost 时,内部 NavHost 现在应正确地呈现动画效果。(I4ba2bb/225394514
  • NavController 提供的 visibleEntries StateFlow 现在基于条目最大生命周期状态,而不是当前生命周期状态。这意味着,即使 navController 的主机生命周期降至 STARTED 以下,可见条目列表也将保持不变。(I9e2a8b/225394514
  • SavedStateViewFactory 现在支持使用 CreationExtras,即使其通过 SavedStateRegistryOwner 进行初始化也不受影响。如果提供 extra,则会忽略初始化的参数。(I6c43bb/224844583
  • NavDeepLink 现在可以使用不含任何值的单个查询参数解析 URI。(I0efe8b/148905489
  • 现在,空字符串在深层链接中被视为有效参数。(I70a0db/217399862
  • 使用命名空间并且不存在 AndroidManifest.xml 时,Navigation Safe Args 将不会再崩溃。(I17ccfb/227229815

版本 2.5.0-alpha03

2022 年 2 月 23 日

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

API 变更

  • 您现在可以将 CreationExtras 传入 by navGraphViewModels 以创建 ViewModel。(I29217b/217618359

bug 修复

  • NavDeepLinks 现在可以正确支持路由/深层链接 URI 中所嵌入的编码的换行符。(I513d1b/217815060
  • 现在与 NavBackStackEntries 搭配使用来创建 ViewModel 时,CreationExtras 能够正常工作。(I69161b/217617710
  • Navigation Safe Args 现在支持使用 build.gradle 中定义的命名空间代替 AndroidManifest 中的软件包。(I659efb/217414933

版本 2.5.0-alpha02

2022 年 2 月 9 日

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

bug 修复

  • Navigation 2.4.1 起:在搭配使用 ViewBinding 和嵌套图时,NavHostFragment 现在可以正确设置 OnBackPressedDispatcher。(Ifbb51b/214577959
  • Navigation 2.4.1 起:当通过多个嵌套的 NavGraph 实现深层链接时,返回堆栈现在可以正确包含中间起始目的地。(I504c0b/214383060

版本 2.5.0-alpha01

2022 年 1 月 26 日

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

新功能

bug 修复

  • 修复了访问从 Fragment 的 onCreate() 通过 by navGraphViewModels() 创建的 ViewModel 会失败并显示 IllegalStateException 的问题。(I8a14d)
  • NavDeepLink 无需再对参数进行两次不必要的解码,这意味着现在适当的参数会被传递到最终目的地。(I31b0ab/210711399

Safe Args

  • Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle 插件 7.1.0 及更高版本兼容。(I41c88b/213086135b/207670704

版本 2.4.2

版本 2.4.2

2022 年 4 月 6 日

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

bug 修复

版本 2.4.1

版本 2.4.1

2022 年 2 月 9 日

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

bug 修复

  • 在搭配使用 ViewBinding 和嵌套图时,NavHostFragment 现在可以正确设置 OnBackPressedDispatcher。(Ifbb51b/214577959
  • 当通过多个嵌套的 NavGraph 实现深层链接时,返回堆栈现在可以正确包含中间起始目的地。(I504c0b/214383060
  • Navigation 2.5.0-alpha01 向后移植:修复了访问从 fragment 的 onCreate() 通过 by navGraphViewModels() 创建的 ViewModel 会失败并显示 IllegalStateException 的问题。(I8a14d)
  • Navigation 2.5.0-alpha01 向后移植:NavDeepLink 无需再对参数进行两次不必要的解码,这意味着现在适当的参数会被传递到最终目的地。(I31b0ab/210711399
  • Navigation 2.5.0-alpha01 向后移植:Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle 插件 7.1.0 及更高版本兼容。(I41c88b/213086135b/207670704

版本 2.4.0

版本 2.4.0

2022 年 1 月 26 日

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

自 2.3.0 以来的重要变更

  • 所有 Navigation 制品都已使用 Kotlin 重写。这提升了使用泛型(例如 NavType 子类)的类的可为 null 性。所有曾包含在 -ktx 制品中的 Kotlin 扩展函数都已移到其各自的主要制品中。-ktx 制品将继续发布,但它完全是空的。
  • navigation-fragment 制品现在通过新的 AbstractListDetailFragment 包含一个双窗格布局的预构建实现。此 fragment 使用 SlidingPaneLayout 管理列表窗格(由您的子类提供)和详细信息窗格,后者采用 NavHostFragment 作为其实现方法,如示例实现中所示。
  • NavController 上的 currentBackStackEntryAsFlow() 方法提供了一个 Flow(会在每次当前 NavBackStackEntry 变化时发出)。此流程可以用作手动管理 OnDestinationChangedListener 的替代方案。
  • NavController 现在可以通过实验性 visibleEntries 属性以 StateFlow 形式检索所有可见 NavBackStackEntry 实例的列表。
  • 现在可以扩展 NavType 类以创建自定义 NavType。只有在程序化地(例如通过 Navigation Graph Kotlin DSL)构建导航图时,才支持自定义类型。
  • Navigation 现在提供 findStartDestination()getHierarchy() API,可用于帮助实现自定义 NavigationUI。findStartDestination() 是针对 NavGraph 的扩展函数,它会定位您导航到该图表时显示的实际起始目的地,即使 startDestination 本身是嵌套的 NavGraph 也是如此。getHierarchy()NavDestination 上的一个函数,可用于验证给定目的地是否在另一个目的地的层次结构中。

    val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
    
  • 更新了 NavigationUI 方法,从接受 BottomNavigationView 改为接受在 Material 1.4.0NavigationBarView 中引入的它的父类。这样一来,这些方法就可以与 NavigationRailView 搭配使用。

  • 通过 XML 膨胀 <action> 元素时,动画属性可以使用通过 app:enterAnim="?attr/transitionEnter" 语法从主题中提取的属性。

  • Safe Args 现在会为每个 NavArgs 类生成一个 fromSavedStateHandle() 方法。(#122b/136967621

    class HomeViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
      // Create a HomeDestinationArgs class with type safe accessors for each argument
      // defined on your destination
      private val args = HomeDestinationArgs.fromSavedStateHandle(savedStateHandle)
    }
    

导航路线和 Kotlin DSL

以前版本的 Navigation 依赖于每个目的地具有一个常量整数 ID,该 ID 能从其同级目的地中唯一地标识它,并且允许您直接或通过操作 navigate() 到该目的地。虽然这种做法仍然有效且很实用,尤其是当您在 XML 中定义导航图且可以使用自动生成的 R.id 常量或 Safe Args(在构建时使用这些常量生成代码)时,但这种独特整数系统不能通过 Navigation Kotlin DSL 捕获在运行时以程序化方式构建的完整动态图所需的语义和表现形式。

此版本引入了一个新选项,有助于按目的地的路线在导航图中唯一地标识目的地。路线是定义目的地唯一路径的 String。所有接受目的地 ID 的 Kotlin DSL 方法现已废弃,取而代之的是接受路线的等效 API。

每个路线都应被视为定义该目的地的 Uri 的“路径”部分,例如:homeprofile/{userId}profile/{userId}/friends 等。当某个目的地的身份与一段具体内容相关联时,这些动态参数就应是路线的一部分,并遵循与隐式深层链接相同的规则。

所有过去仅接受 ID 的 NavController API 现在都具有接受路线 String 的过载。这包括 navigate()popBackStack()popUpTo()getBackStackEntry()

这产生了一些 API 影响:

  • Kotlin DSL 中的 popUpTo Kotlin 属性已被废弃,取而代之的是 popUpToId
  • getStartDestination() API 已废弃,取而代之的是 getStartDestinationId()

与按 ID 导航不同,按路线导航与隐式深层链接遵循的规则相同,因为您可以直接导航到任何嵌套图表中的任何目的地,确保这些路线在多模块项目中可以使用,而无需向每个目的地明确添加外部可见的深层链接。

Navigation Compose

navigation-compose 制品集成了 Navigation ComponentJetpack Compose,且在应用中将 @Composable 函数作为目的地。

此版本提供了:

  • NavHost 可组合项,允许您使用 composabledialog 目的地通过 Kotlin DSL 构建导航图,并且支持可选导航器,如 Accompanist Navigation Material 中的导航器。
  • 强制支持在目的地之间淡入淡出。Accompanist Navigation Animation 可用于使用实验性 Compose API 控制进入和退出过渡效果。
  • Lifecycle 的范围限定为每个可组合目的地。每个目的地只会在任何进入过渡效果完成时达到 RESUMED 状态,并且在任何退出过渡效果开始时变为 STARTED 状态,从而仅在 LifecycleRESUMED 状态时触发 navigate,避免所有 IllegalStateException 和多触摸问题。
  • 在目的地级别限定 ViewModel 的作用域(通过 Lifecycle ViewModel Compose 2.4.0viewModel() API 或 Hilt Navigation Compose 1.0.0hiltViewModel()),提供一个在配置更改后继续存在并且位于返回堆栈上(当可组合的内容以其他方式被处理时)的作用域,并在 ViewModel 的 onCleared() 中提供一个信号,指示系统永久处理和清理与该 NavBackStackEntry 相关的状态。
  • 在目的地级别限定 rememberSaveable 状态的范围,确保自动保存所有可组合状态,并在您返回到目的地时恢复状态。
  • 完全支持保存 NavController 的状态及其目的地的状态,并在进程被销毁和重新创建后,恢复这些状态。
  • 自动与系统的返回按钮集成。
  • 可传递参数、将深层链接附加到目的地以及将结果返回到前一个目的地。

  • rememberNavController()currentBackStackEntryAsState() 中特定于 Compose 的帮助程序可提升状态并将 NavController 连接到 NavHost 以外的可组合项(例如底部的导航栏)。

val navController = rememberNavController()
Scaffold { innerPadding ->
    NavHost(navController, "home", Modifier.padding(innerPadding)) {
        composable("home") {
            // This content fills the area provided to the NavHost
            HomeScreen()
        }
        dialog("detail_dialog") {
            // This content will be automatically added to a Dialog() composable
            // and appear above the HomeScreen or other composable destinations
            DetailDialogContent()
        }
    }
}

如需了解详情,请参阅 Compose Navigation 指南

多个返回堆栈

NavController 负责:管理目的地的返回堆栈,在您 navigate() 到相应目的地时将目的地添加到返回堆栈,以及在您调用 popBackStack() 或触发系统的返回按钮时移除目的地。我们扩展了导航图 XML 中现有的 NavOptions 类及到 <action> 元素的集成,以便支持保存和恢复返回堆栈。

作为此变更的一部分,onNavDestinationSelected()BottomNavigationView.setupWithNavController()NavigationView.setupWithNavController()NavigationUI 方法现在会自动保存并恢复弹出的目的地的状态,从而在不更改任何代码的情况下支持多个返回堆栈。将 Navigation 与 Fragment 搭配使用时,建议采用这种方式与多个返回堆栈集成。

用于保存和恢复状态的底层 API 会通过许多途径公开:

  • 在 Navigation XML 中,<action> 元素现在可以使用 app:popUpToSaveStateapp:restoreState 的布尔属性来保存通过 app:popUpTo 弹出的任何目的地的状态,并恢复作为 app:destination 传递的目的地的关联状态:

    <action
      android:id=”@+id/swap_stack”
      app:destination=”@id/second_stack”
      app:restoreState=”true”
      app:popUpTo=”@id/first_stack_start_destination”
      app:popUpToSaveState=”true” />
    
  • navOptions Kotlin DSL 中,您可以在 popUpTo 构建器上添加 restoreStatesaveState 布尔属性:

    // Use the navigate() method that takes a navOptions DSL Builder
    navController.navigate(selectedBottomNavRoute) {
      launchSingleTop = true
      restoreState = true
      popUpTo(navController.graph.findStartDestination().id) {
        saveState = true
      }
    }
    
  • 在通过 NavOptions.Builder 手动构建 NavOptions 对象时,您可以将 setRestoreState() 和新的过载用于采用了额外 saveState 参数的 setPopUpTo()

    NavOptions navOptions = new NavOptions.Builder()
      .setLaunchSingleTop(true)
      .setRestoreState(true)
      .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(),
        false, // inclusive
        true) // saveState
      .build();
    navController.navigate(selectedBottomNavId, null, navOptions);
    
  • popBackStack() 的程序化调用现在可以包含额外的 saveState 参数。

  • 您可以使用 clearBackStack() 方法清除使用 popBackStack()popUpToSaveState 保存的状态。

在所有情况下,NavController 都将保存并恢复每个 NavBackStackEntry(包括任何已限定导航目的地范围的 ViewModel 实例)的状态。我们更新了 Navigator API,使每个 Navigator 都支持保存和恢复自己的状态。

行为变更

  • NavDeepLinkBuilder 现在将 PendingIntent.FLAG_IMMUTABLE 添加到了 createPendingIntent() 返回的 PendingIntent 中,从而确保此 API 在以 Android 12 为目标平台时按预期工作。
  • Navigation 现在依赖于 Lifecycle 2.3.1,并且现在会将更新 NavBackStackEntry LifecyclesetGraph()popBackStack()navigateUp()navigate() 方法标记为 @MainThread,从而使 Navigation 与 Lifecycle 2.3.0 中引入的主线程强制执行保持一致。
  • 深层链接现在会验证 Uri 中是否存在所有必需的参数(不存在默认值的参数)。
  • 现在,NavDeepLink 在解析参数时,会将井号与英文问号一样视为路径片段分隔符,可防止参数跨越井号进行显示。
  • 生成操作时,从 Safe Args 生成的 Kotlin 代码现在会将不具有默认值的参数放在具有默认值的参数之前。
  • 生成参数时,Safe Args 现在会将不具有默认值的参数放在具有默认值的参数之前。
  • Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。也就是说,您应该不会再收到使用 applicationIdTextResource 的警告。

已知问题

  • 修复了 Navigation 2.5.0-alpha01 中的以下问题:访问从 Fragment 的 onCreate() 通过 by navGraphViewModels() 创建的 ViewModel 将失败并显示 IllegalStateException。(b/213504272)
  • 修复了 Navigation 2.5.0-alpha01 中的以下问题:Safe Args 2.4.0 与 Android Gradle 插件 7.1.0 及更高版本不兼容。(b/213086135)
  • 如果深层链接包含多个嵌套导航图,则无法正确创建完整的返回堆栈。(b/214383060)

版本 2.4.0-rc01

2021 年 12 月 15 日

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

行为变更

  • 现在,NavDeepLink 在解析参数时,会将井号与英文问号一样视为参数分隔符。(I21309b/180042703

bug 修复

  • 深层链接将不再忽略值与占位符名称相同的参数。(If8017b/207389470
  • NavController 恢复后,使用转换弹出嵌套目的地时,NavController 将不再崩溃。(I0f7c9b/205021623
  • 现在,使用无效 startDestination 时的错误消息将默认为起始目的地的路线(如果有)。(I86b9db/208041894

Navigation Compose bug 修复

  • 修复了由于使用底部导航菜单项在起始目的地和其他目的地之间快速切换而导致的潜在崩溃。(Ic8976b/208887901
  • 现在,在配置发生变化或进程终止后,对话框目的地可在屏幕顶部正确恢复。(I4c0dcb/207386169
  • 修复了以下问题:对话框关闭后,尝试从对话框的 NavBackStackEntry 获取 ViewModel 会失败。(I6b96db/206465487
  • 修复了以下问题:将 activity 目的地与 Navigation Compose 的 NavHost 一起使用时,会导致无限重组。(I8f64c)
  • 修复了 Navigation Compose 中的一个漏洞,即在配置发生变化或进程终止后,它会保留对旧 activity 的引用。(I4efcbb/204905432

Safe Args bug 修复

  • SafeArgs 在进程终止后尝试恢复自定义 parcelable 数组时,不会再崩溃。(I618e8b/207315994
  • 修复了 Safe Args 中的一个 bug,该 bug 会导致布尔数组不能使用 null 值。(I8c396b/174787525

版本 2.4.0-beta02

2021 年 11 月 3 日

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

API 变更

  • 现在,当导航到另一个导航图时,系统处理显式和隐式深层链接时会自动添加 saveState 标记,以确保 NavigationUI.setupWithNavController 之类的代码以及使用多个返回堆栈的代码能够按预期运行。(Ic8807)

行为变更

  • 现在,深层链接模式是在 NavDeepLink 中进行延迟编译,而不是在膨胀期间进行编译。这可以缩短包含深层链接的导航图的膨胀时间。 (b8d257b/184149935

bug 修复

  • 修复了在将 NavHost 直接添加到 activity 的 setContent() 时,NavBackStackEntries 移至 Lifecycle.State.STARTED 后被下推到 Lifecycle.State.CREATED 的问题。(Ia5ac1b/203536683
  • 修复了一个竞态条件,即在实际显示对话框之前从返回堆栈中抛出 DialogFragment 目的地实际上并不会关闭对话框,导致出现崩溃,错误对话框只能由用户手动关闭。(I687e5)
  • 修复了即使您实际上并未 navigate() 到导航图,NavigationUI 上的 onNavDestinationSelected API 也会返回 true 的问题。现在,该 API 使用 setupWithNavController 在内部使用的相同逻辑,通过目的地 hierarchy 仅选择与当前目的地相关联的 MenuItem。(I2b053)

版本 2.4.0-beta01

2021 年 10 月 27 日

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

新功能

  • 现在,您可以将 by navGraphViewModel 与路线一起使用,作为使用 ID 的替代方法,以便更好地支持将 Navigation Kotlin DSL 与 Fragment 配合使用。(I901e3b/201446416

API 变更

  • visibleEntries API 目前处于实验阶段。(I93f6f)

bug 修复

  • 过渡因在相同屏幕之间来回切换而中断时,系统将不再销毁 ViewModel(Id52d8b/200817333
  • NavDestination 添加深层链接时,可为 null 的 NavDeepLink 参数不再需要默认值。(I5aad4b/201320030
  • 现在,系统不再将生命周期不同的 NavBackStackEntry 视为等同。也就是说,使用 singleTop 进行导航以及重新选择底部菜单项时,NavHost 会正确地重组所有目的地。(I1b351b/196997433)
  • 修复了 AbstractListDetailFragment 存在的以下问题:导致系统错误地处理或忽略 onCreateListPaneView() 返回的列表窗格中的 layout_widthlayout_weight 属性。(f5fbf3)
  • 现在,对话框目的地的视觉状态会正确地与 DialogFragmentNavigator 的状态保持同步。这意味着,现在,如果针对 DialogFragment 手动调用异步 dismiss() API,系统会正确地清除现已关闭的对话框之上的所有对话框目的地。这不会对您使用 popUpTopopBackStack() 关闭对话框的情况产生任何影响。(I77ba2)
  • 现在,AbstractAppBarOnDestinationChangedListener 可以针对 onDestinationChanged() 提供更明确的错误消息。(Ie742d)

版本 2.4.0-alpha10

2021 年 9 月 29 日

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

新功能

  • NavController 现在支持通过 visibleEntries StateFlow 检索所有可见 NavBackStackEntry 实例的列表 (Ia964e)
  • rememberNavController() 现在接受一组可选的 Navigator 实例,这组实例将添加到返回的 NavController 中,以便更好地支持可选导航器(例如来自 Accompanist Navigation Material 的导航器)。(I4619e)

bug 修复

  • 重新创建 activity 时,Dynamic Navigation 将不会再崩溃。(Ifa6a3b/197942869
  • 修复了仅在出栈回包含 NavHost 的可组合项目的地后才会发生的系统返回按钮问题。(3ed148b/195668143
  • SafeArgs 现在会以适当的参数顺序为 fromBundle()fromSavedStateHandle() 生成参数。(I824a8b/200059831

版本 2.4.0-alpha09

2021 年 9 月 15 日

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

新功能

  • 您现在可以使用 clearBackStack() 方法来清除使用 popBackStack()popUpToSaveState 保存的状态。(I80a0f)
  • 现在,您可以向嵌套导航图的构建器传入参数和/或深层链接的列表,它们将自动添加到生成的图表中。(I8a470b/182545357

API 变更

  • navArgument Kotlin DSL 函数现在是 navigation-common(而非 navigation-compose)的一部分。这将需要更新 import 语句,才能继续使用此函数。(I1d095)

行为变更

  • 生成参数时,Safe Args 现在会将不含默认值的参数放在具有默认值的参数之前。(I89709b/198493585

bug 修复

  • 在使用 Navigation Compose 时,NavGraph 只有在其所有子级都处于 DESTROYED 状态后,才会处于 DESTROYED 状态。(I86552b/198741720
  • 可为 null 的 NavDeepLink 参数不再需要默认值。(Ia14efb/198689811
  • 现在,使用新图调用 setGraph() 时,不仅会清除返回堆栈之前的出栈行为,而且还会清除所有已保存的返回堆栈。(I97f96)
  • 修复了在使用 launchSingleTop 时不通知 OnDestinationChangedListener 实例和 currentBackStackEntryFlow 的问题。(Iaaebc)

依赖项更新

版本 2.4.0-alpha08

2021 年 9 月 1 日

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

新功能

行为变更

  • 生成操作时,从 Safe Args 生成的 Kotlin 代码现在会将不具有默认值的参数放在具有默认值的参数之前。(Idb697b/188855904
  • 深层链接现在会验证 Uri 中是否存在所有必需的参数(不存在默认值的参数)。(#204b/185527157

bug 修复

  • 将 composable() 内的 getBackStackEntrypreviousBackStackEntryremember() 结合使用不会再导致因返回堆栈上没有目的地而出现异常。(I75138b/194313238
  • 在更改返回堆栈参数和使用 launchSingleTop=true 时,Navigation Compose 现在会正确进行重组。(Iebd69b/186392337
  • 使用具有 13 个或 29 个目的地的图调用 setGraph 时,不再会出现 ArrayIndexOutOfBoundsException。(I1a9f1b/195171984
  • SafeArgs Java 生成器在生成 Args 类时应该不会再导致 lint 警告。(I1a666b/185843837

外部贡献

  • 感谢 ospixd 确保深层链接会验证 Uri 中是否存在所有必需的参数(不含默认值的参数)。(#204b/185527157

版本 2.4.0-alpha07

2021 年 8 月 18 日

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

bug 修复

  • 现在,Navigation Compose 可在配置更改后以及使用多个返回堆栈功能期间更改图时正确保存状态。(If5a3db/195141957
  • 将 Navigation Compose 与多个返回堆栈搭配使用时,重新选择同一标签页不会再生成空白屏幕。(I860dcb/194925622
  • NavHost 现在会观察 NavBackStackEntryLifecycle.State 中的更改,这意味着当生命周期更改时,在 fragment 中使用 NavHost 现在会正确重组,而不是生成空白界面。(I4eb85b/195864489
  • 修复了以下问题:重新创建 activity 后(即配置更改后),关闭 DialogFragment 无法正确更新 NavController 状态。(Icd72b)
  • 修复了以下问题:弹出对话框目的地不会更新 NavController 的系统返回按钮处理情况,这可能会导致 NavController 拦截返回按钮,即使该按钮没有任何要弹出的返回堆栈。(If3b34)
  • Safe-args 现在会自动为参数生成 toSavedStateHandle 方法,该方法可用于测试 ViewModel 代码。(If1e2db/193353880

版本 2.4.0-alpha06

2021 年 8 月 4 日

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

API 变更

  • AbstractListDetailFragment 中的 requireSlidingPaneLayout()requireDetailPaneNavHostFragment() 方法已分别重命名为 getSlidingPaneLayout()getDetailPaneNavHostFragment()。(I34a08)

行为变更

  • 现在,当用户通过动画(如 Crossfade)导航时,新目的地的 Lifecycle 将仅在动画播放完毕时达到 RESUMED 状态。(If0543b/172112072b/194301889
  • Navigation Compose 的 NavHost 现在会将图设置为第一个组合的一部分。(Ieb7be)

bug 修复

  • 在弹出某个导航图的最后一个目的地时,系统不会再抛出 ClassCastException。(If0543b/172112072b/194301889
  • 修复了以下问题:在没有 Uri 的情况下添加深层链接时,以及在通过路由或深层链接进行导航时,会发生 NullPointerException。(938a0cb/193805425
  • 修复了 Navigation Compose 中添加了深层链接的 NavBackStackEntry 无法达到 RESUMED 状态的问题。(I192c5)
  • 修复了以下问题:弹出对话框目的地不会更新 NavController 的系统返回按钮处理情况,这可能会导致 NavController 拦截返回按钮,即使该按钮没有任何要弹出的返回堆栈。(aosp/1782668)

版本 2.4.0-alpha05

2021 年 7 月 21 日

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

行为变更

  • 在目的地之间导航时,Navigation Compose 的 NavHost 现在始终使用淡入淡出。(I07049b/172112072
  • 您现在可以更改 NavHost 的图表。具有相同 startDestination 的图表和图表中的目的地将被视为相等,并且不会清除 NavController 返回堆栈。(I0b8dbb/175392262

bug 修复

  • 修复了从附加到 NavBackStackEntryLifecycleObserver 中调用 popBackStack() 时因 NavController 状态的可重入更新而出现的 NoSuchElementException。(I64621)
  • AbstractListDetailFragment 现在允许在未使用 AbstractListDetailFragment 时从 APK 中完全删除 SlidingPaneLayout。(I611ad)
  • NavGraphNavDestination 现在替换了 equals 方法,因此两个具有相同值的对象将被视为相等。(I166ebb/175392262

版本 2.4.0-alpha04

2021 年 7 月 1 日

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

新功能

  • navigation-fragment 制品现在通过新的 AbstractListDetailFragment 包含一个双窗格布局的预构建实现。此 fragment 使用 SlidingPaneLayout 管理列表窗格(由您的子类提供)和详细信息窗格,后者采用 NavHostFragment 作为其实现方法,如示例实现中所示。(Iac4beb/191276636
  • navigation-compose 制品的 NavHost 现在除了支持 composable 目的地之外,还支持 dialog 目的地。这些对话框目的地会显示在各自对应的可组合项 Dialog 内,并悬浮在当前的 composable 目的地上方。(I011d0)
val navController = rememberNavController()
    Scaffold { innerPadding ->
        NavHost(navController, "home", Modifier.padding(innerPadding)) {
            composable("home") {
                // This content fills the area provided to the NavHost
                HomeScreen()
            }
            dialog("detail_dialog") {
                // This content will be automatically added to a Dialog() composable
                // and appear above the HomeScreen or other composable destinations
                DetailDialogContent()
            }
        }
    }

API 变更

  • NavigatorState 中的 add 函数已重命名为 push。当前对 add() 的所有调用都需要更改为 push()。(Ie89fcb/172112072
  • 自定义 Navigator 实例现在可以使用 NavigatorState 中的 pushWithTransactionpopWithTransition API 对目的地异步执行入栈或出栈操作。请注意,此 API 尚未用于任何已包含的导航器。(Ic4d7cb/172112072

行为变更

  • NavDeepLinkBuilder 现在将 PendingIntent.FLAG_IMMUTABLE 添加到了 createPendingIntent() 返回的 PendingIntent 中,从而确保此 API 在以 Android 12 为目标平台时按预期工作。(If8c52)

bug 修复

  • 修复了 <include-dynamic> 存在的以下问题:传递给图表的参数无法正确传递给动态包含的图表。(I3e115)
  • 修复了使用默认值为 @nullstring[] 参数导航到目的地时抛出 NullPointerException 的问题。(I1fbe8)
  • @Navigator.Name 添加了 ProGuard 规则,修复了使用 R8 3.1 完整模式时出现的问题。(I2add9b/191654433
  • 使用 1.5.0 之前的 Kotlin 版本构建应用时,SafeArgs 不会再失败。(Icd1ffb/190739257

版本 2.4.0-alpha03

2021 年 6 月 16 日

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

bug 修复

  • 修复了需要调用两次 navigate() 才能转到包含的动态图的问题。(I7785cb/188859835
  • 修复了 Navigation 2.4.0-alpha01 中引入的如下回归问题:当您位于顶层目的地时,setupActionBarWithNavController() 无法正确移除向上图标。(I5d443b/189868637
  • 修复了在先弹出 NavController 的根图后调用 popBackStack() 时出现的 IllegalStateException。(I2a330b/190265699
  • 现在,在使用 navigation-common 或任何依赖于它的制品时,可以正确对 by navArgs() 应用 ProGuard 规则。(I68800b/190082521
  • 在第一次收到回调时调用 navigate()OnDestinationChangedListener 现在可以正确获取包含要转到的目的地的第二次回调。(Ie5f9eb/190228815
  • 在将 Safe Args 与动态功能模块和 AGP 7.0 及更高版本结合使用时,Safe Args 不再崩溃。(I69518b/189966576

已知问题

  • 由于依赖于旧版 Kotlin,因此在使用 Gradle 6.7.0 时,Safe Args 将运行失败,并显示 Unable to find method ‘’java.lang.String kotlin.text.CarsKt.titleCase(char, java.util.Locale)’’ 错误。如需解决此问题,请更新为使用 Gradle 7.0。(b/190739257)

版本 2.4.0-alpha02

2021 年 6 月 2 日

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

新功能

  • activity、fragment 和 dialog 目的地以及整个 DynamicNavigation Kotlin DSL 现在支持路线。(Ib5544Ia617bI22f96b/188914648b/188901565
  • NavigationUI 暂时添加了实验性 API,以允许选择不保存状态。虽然始终保存状态才是正确的行为,但仍会在保存状态时使用一些不受支持的废弃库(即保留的 fragment),这就让应用有机会慢慢减少对不受支持 API 的使用。(Idf93c)
  • Navigation 现在提供 findDestination()getHierarchy() API,可用于帮助实现自定义 NavigationUI。findDestination() 是针对 NavGraph 的扩展函数,用于在图中查找目的地。getHierarchy() 是针对 NavDestination 的函数,可用于验证给定目的地是否位于另一个目的地的层次结构中。(I2932fb/188183365

    val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
    
  • 更新了 NavigationUI 方法,从接受 BottomNavigationView 改为接受在 Material 1.4.0NavigationBarView 中引入的它的父类。这样一来,这些方法就可以与 NavigationRailView 搭配使用。(Ib0b36b/182938895

  • 通过 XML 膨胀 <action> 元素时,动画属性可以使用通过 app:enterAnim="?attr/transitionEnter" 语法从主题中提取的属性。(I07bc1b/178291654

API 变更

bug 修复

  • 现在,如果对话框是通过按系统返回按钮或点击对话框外的任意位置来关闭的,DialogFragmentNavigator 会使用 NavigatorState.pop() API 来通知 NavController,从而确保 NavController 状态与导航器的状态始终保持同步。(I2ead9)
  • 在使用 onDestinationChanged 回调操控 OnDestinationChangedListeners 的列表时,Navigation 不再提供 ConcurrentModificationException。(Ib1707b/188860458

  • 在 Kotlin 中尝试生成方向属性时,Safe Args 不再崩溃。(Id2416b/188564435

  • 针对 NavDestination 的 setId 方法现在已使用 @IdRes 正确进行注解,因此只接受资源 ID。(I69b80)

  • findNode 的 int 参数现为 resId,而不是 resid。(I7711d)

依赖项更新

  • Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。也就是说,您应该不会再收到使用 applicationIdTextResource 的警告。(I6d67bb/172824579

版本 2.4.0-alpha01

2021 年 5 月 18 日

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

新功能

  • NavController 上的 currentBackStackEntryAsFlow() 方法提供了一个 Flow(会在每次当前 NavBackStackEntry 变化时发出)。此流程可以用作手动管理 OnDestinationChangedListener 的替代方案。(I19c4a#89b/163947280

多个返回堆栈

NavController 负责:管理目的地的返回堆栈,在您 navigate() 到相应目的地时将目的地添加到返回堆栈,以及在您调用 popBackStack() 或触发系统的返回按钮时移除目的地。我们扩展了导航图 XML 中现有的 NavOptions 类及 <action> 条目中的集成,以便支持保存和恢复返回堆栈。(b/80029773)

作为此变更的一部分,onNavDestinationSelected()BottomNavigationView.setupWithNavController()NavigationView.setupWithNavController()NavigationUI 方法现在会自动保存并恢复弹出的目的地的状态,从而在不更改任何代码的情况下支持多个返回堆栈。将 Navigation 与 Fragment 搭配使用时,建议采用这种方式与多个返回堆栈集成。(Ie07ca)

用于保存和恢复状态的底层 API 会通过许多途径公开:

  • 在 Navigation XML 中,<action> 元素现在可以使用 app:popUpToSaveStateapp:restoreState 的布尔属性来保存通过 app:popUpTo 弹出的任何目的地的状态,并恢复作为 app:destination 传递的目的地的关联状态:

    <action
      android:id=”@+id/swap_stack”
      app:destination=”@id/second_stack”
      app:restoreState=”true”
      app:popUpTo=”@id/first_stack_start_destination”
      app:popUpToSaveState=”true” />
    
  • navOptions Kotlin DSL 中,您可以在 popUpTo 构建器上添加 restoreStatesaveState 布尔属性:

    // Use the navigate() method that takes a navOptions DSL Builder
    navController.navigate(selectedBottomNavRoute) {
      launchSingleTop = true
      restoreState = true
      popUpTo(navController.graph.startDestinationId) {
        saveState = true
      }
    }
    
  • 在通过 NavOptions.Builder 手动构建 NavOptions 对象时,您可以将 setRestoreState() 和新的过载用于采用了额外 saveState 参数的 setPopUpTo()

    NavOptions navOptions = new NavOptions.Builder()
      .setLaunchSingleTop(true)
      .setRestoreState(true)
      .setPopUpTo(navController.getGraph().getStartDestinationId(),
        false, // inclusive
        true) // saveState
      .build();
    navController.navigate(selectedBottomNavId, null, navOptions);
    
  • popBackStack() 的程序化调用现在可以包含额外的 saveState 参数。

在所有情况下,NavController 都将保存并恢复每个 NavBackStackEntry(包括任何已限定导航目的地范围的 ViewModel 实例)的状态。我们更新了 Navigator API,使每个 Navigator 都支持保存和恢复自己的状态。

我们还更新了 Navigation Compose 中 composable 目的地所用的 ComposeNavigator 以及包含 Fragment 的 Navigation 中的 <fragment> 目的地所用的 FragmentNavigatorDynamicFragmentNavigator,以便使用新的导航器 API 并支持保存和恢复状态。

导航路线

路线是用于标识目的地的 String,其具有唯一性。此概念之前仅用于 Navigation Compose 中,但现在已逐渐成为核心 Navigation API 的一部分。在通过 Navigation Kotlin DSL 构建图表时,这可以作为使用整数 ID 的替代方案。(b/172823546)

所有过去仅采用 ID 的 API 现在都具有采用路线 String 的过载。这包括 navigate()popBackStack()popUpTo()getBackStackEntry()

这产生了一些 API 影响:

  • Kotlin DSL 中的 popUpTo Kotlin 属性已被废弃,取而代之的是 popUpToId。(I59c73b/172823546
  • getStartDestination() API 已被废弃,取而代之的是 getStartDestinationId()。(I0887fb/172823546

对于从旧版 Navigation Compose 升级到 Navigation Compose 2.4.0-alpha01 的开发者来说,这意味着不再需要以下对扩展方法的导入,应该将其移除:

import androidx.navigation.compose.navigation
import androidx.navigation.compose.createGraph
import androidx.navigation.compose.getBackStackEntry
import androidx.navigation.compose.navigate
import androidx.navigation.compose.popUpTo

KEY_ROUTE 参数已被 NavDestination 中的 route 属性取代,这使您可以直接调用 navBackStackEntry.destination.route

API 变更

  • 所有 Navigation 制品都已使用 Kotlin 重写。这提升了使用泛型(例如 NavType 子类)的类的可为 null 性。所有曾包含在 -ktx 制品中的 Kotlin 扩展函数都已移到其各自的主要制品中。-ktx 制品将继续发布,但它完全是空的。(b/184292145)
  • NavDeepLinkBuilder 现在支持向生成的返回堆栈中添加多个不同的目的地。(I3ee0db/147913689
  • DynamicNavHostFragment 添加了工厂函数(Icd515b/175222619
  • NavBackStackEntry 的唯一 ID 现已作为其公共 API 的一部分公开。(Ie033a)
  • NamedNavArgument 的“name”字段、“argument”字段和解构函数现已公开。(#174b/181320559
  • 引入了新的 NavBackStackEntry#provideToCompositionLocals 扩展,它会向相关的 CompositionLocal 提供 NavBackStackEntry。(#175b/187229439

Safe Args

  • Safe Args 现在会为每个 NavArgs 类生成一个 fromSavedStateHandle() 方法。(#122b/136967621

    class HomeViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
      // Create a HomeDestinationArgs class with type safe accessors for each argument
      // defined on your destination
      private val args = HomeDestinationArgs.fromSavedStateHandle(savedStateHandle)
    }
    
  • 更新了 Safe Args,使其依赖于 KotlinPoet 1.8.0。(#172b/183990444

行为变更

  • Navigation 现在依赖于 Lifecycle 2.3.1,并且现在会将更新 NavBackStackEntry LifecyclesetGraph()popBackStack()navigateUp()navigate() 方法标记为 @MainThread,从而使 Navigation 与 Lifecycle 2.3.0 中引入的主线程强制执行保持一致。(b/171125856)
  • 现在,解析来自深层链接的枚举参数时不区分大小写,举个例子:即使枚举值为 RED,深层链接 http://www.example.com/red 也会匹配深层链接 www.example.com/{color}。(#152b/135857840

Compose 兼容性

  • androidx.navigation:navigation-compose:2.4.0-alpha01 仅与 Compose 版本 1.0.0-beta07 及更高版本兼容。

bug 修复

  • 修复了以下问题:末尾的参数占位符会优先于后缀完全匹配的深层链接。(#153b/184072811
  • NavHostFragment 现在支持与默认 DialogFragmentNavigator 使用同一 @Navigator.Name("dialog") 的自定义导航器。(Ib1c2cb/175979140
  • 改进了 NavigatorProvider#addNavigator 的行为,以确保使用同一实例反复调用它不会产生问题。(#176b/187443146

外部贡献

  • 感谢 simonschiller 实现对 Safe Args 的支持,从而为每个 NavArgs 类生成一个 fromSavedStateHandle() 方法。(#122b/136967621
  • 感谢 Bradleycorn 实现解析来自深层链接的枚举参数时不区分大小写。(#152b/135857840
  • 感谢 osipxd 修复了以下问题:末尾的参数占位符会优先于后缀完全匹配的深层链接。(#153b/184072811
  • 感谢 tatocaster 将 Safe Args 更新为依赖于 KotlinPoet 1.8.0。(#172b/183990444
  • 感谢 jossiwolf 使 NamedNavArgument 的“name”字段、“argument”字段和解构函数公开。(#174b/181320559
  • 感谢 jossiwol 引入了新的 NavBackStackEntry#provideToCompositionLocals 扩展,从而向相关的 CompositionLocal 提供 NavBackStackEntry。(#175b/187229439
  • 感谢 jossiwolf 改进了 NavigatorProvider#addNavigator 的行为,以确保使用同一实例反复调用它不会产生问题。(#176b/187443146

版本 1.0.0-alpha10

2021 年 4 月 7 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha10版本 1.0.0-alpha10 中包含这些提交内容

API 变更

  • NavHost 现接受 Modifier,后者会向下传递到封装目的地可组合项的可组合容器。(I85acab/175125483

bug 修复

  • 现在,即使未找到 OnBackPressedDispatcherOwner(例如在预览 NavHost 时),NavHost 也可正常运行。(I7d8b4)
  • Navigation Compose 现在依赖于 Navigation 2.3.5,修复了在 NavHost 目的地内使用 BackHandler 时出现的问题。(I7e63bb/182284739

版本 1.0.0-alpha09

2021 年 3 月 10 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha09版本 1.0.0-alpha09 中包含这些提交内容

API 变更

  • LocalViewModelStoreOwner.current 现在会返回可为 null 的 ViewModelStoreOwner,以更好地确定 ViewModelStoreOwner 在当前组合中是否可用。如果未设置 ViewModelStoreOwner,则需要 ViewModelStoreOwner 的 API(例如 viewModel()NavHost)仍会抛出异常。(Idf39a)

bug 修复

  • Navigation Compose 现在依赖于 Navigation 2.3.4,其中修复了在设置图表后尝试设置同一 ViewModelStore 对象的问题。(I65c24b/177825470

版本 1.0.0-alpha08

2021 年 2 月 24 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha08版本 1.0.0-alpha08 中包含这些提交内容

新功能

  • NavHost 现在使用目的地的 NavBackStackEntry 填充 LocalSavedStateRegistryOwner CompositionLocal,以确保直接保存到 SavedStateRegistry 中的所有状态都将随目的地一起保存并恢复。(I435d7b/179469431

版本 1.0.0-alpha07

2021 年 2 月 10 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha07版本 1.0.0-alpha07 中包含这些提交内容

依赖项更新

版本 1.0.0-alpha06

2021 年 1 月 28 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha06版本 1.0.0-alpha06 中包含这些提交内容

API 变更

  • NavController 中添加了 getBackStackEntry(route: String) 扩展方法,该方法会返回关联的 NavBackStackEntry。(If8931)

版本 1.0.0-alpha05

2021 年 1 月 13 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha05版本 1.0.0-alpha05 中包含这些提交内容。

进行了更新,以依赖 Compose 1.0.0-alpha10。

版本 1.0.0-alpha04

2020 年 12 月 16 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha04版本 1.0.0-alpha04 中包含这些提交内容

  • 进行了更新,以便与 Compose 1.0.0-alpha09 兼容。

版本 1.0.0-alpha03

2020 年 12 月 2 日

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

bug 修复

  • 修复了以下问题:配置更改或进程终止和重新创建后,popBackStack()navigateUp() 无法工作。(Icea47b/173281473
  • 现在,导航至 NavHost 中的嵌套图表可以正常工作。(I0948db/173647694

版本 1.0.0-alpha02

2020 年 11 月 11 日

发布了 androidx.navigation:navigation-compose:1.0.0-alpha02版本 1.0.0-alpha02 中包含这些提交内容

API 变更

  • Navigation Compose 现已支持使用 popUpTo 和 launchSingleTop 操作所需的 NavOptions(If96c3b/171468994
  • 添加了使用路由而非 ID 的导航函数,您可在 Navigation Compose DSL 中构建嵌套图表。(I1661d)
  • startDestination 现已在 NavHost 参数列表中位于路由之前 (Ie620e)
  • 您现已可以将路由作为 NavHost 可组合项以外的初始目的地来创建图表。(Iceb75)

版本 1.0.0-alpha01

2020 年 10 月 28 日

发布了 android.navigation:navigation-compose:1.0.0-alpha01版本 1.0.0-alpha01 中包含这些提交内容

新功能

navigation-compose 制品集成了 Navigation ComponentJetpack Compose,且在应用中将 @Composable 函数作为目的地。

此初始版本包含以下各项:

  • NavHost 可组合项允许您通过 Kotlin DSL 构建导航图表。
  • 可在目标位置级别对生命周期、ViewModel 和记忆状态进行限定。
  • 自动与系统的返回按钮集成。
  • 可传递参数、将深层链接附加到目的地以及将结果返回到前一个目的地。
  • rememberNavController()currentBackStackEntryAsState() 中特定于 Compose 的帮助程序可提升状态并将 NavController 连接到 NavHost 以外的可组合项(例如底部的导航栏)。

如需了解详情,请参阅 Compose Navigation 指南

版本 2.3.5

版本 2.3.5

2021 年 4 月 7 日

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

新功能

  • 使用 NavDeepLinkRequestUri 进行导航时,您现在可以访问生成的目的地中的 Uri、操作和 MIME 类型,方法是通过 KEY_DEEP_LINK_INTENT,获取来自参数的 intent,对应于已提供的外部深层链接功能。(I975c3b/181521877

bug 修复

  • OnBackPressedCallbacks 已添加至带有 NavBackStackEntry 的调度程序,现在,如果 Activity Lifecycle 先为 STOPPED,然后重新变为 STARTED,则 LifecycleOwner 会正确拦截返回操作。(Iff94f, b/182284739)
  • 深层链接域名解析现在不区分大小写,因此确保 www.example.comwww.example.comwww.Example.com 都能匹配。请注意,查询参数名称仍区分大小写。(#144b/153829033
  • 修复了当某个目的地具有多个不可为 null 的默认参数,且导航到该目的地时只覆盖这些参数的子集时,可能出现的 NullPointerException。(aosp/1644827)

依赖项更新

外部贡献

版本 2.3.4

版本 2.3.4

2021 年 3 月 10 日

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

新功能

  • 现在,ReferenceType 参数作为深层链接 URI 的一部分发送时可以得到正确解析。这既支持原始整数值,也支持以 0x 为前缀的十六进制值。(#127b/179166693
  • 具有 app:argType="float" 的参数的 android:defaultValue 现在支持整数默认值,让您可以使用 android:defaultValue="0",而无需使用 0.0。(#117b/173766247

bug 修复

  • 修复了在利用 Navigation 对动态功能的支持时安装进度卡住的问题。(Ib27a7b/169636207
  • 现在,使用已设置的同一对象调用 setViewModelStoresetLifecycleOwner 将成为一项空操作(Idf491b/177825470
  • 现在,使用 java 时,Safe-Args 会在正确的方法上添加抑制注解。(I8fbc5b/179463137

外部贡献

  • 感谢 JvmName 提供的拉取请求,这可确保 ReferenceType 参数现在作为深层链接 URI 的一部分发送时可以得到正确解析。(#127b/179166693
  • 感谢 tatocaster 提供的拉取请求,这可以让具有 app:argType=”float” 的参数的 defaultValue 现在支持整数默认值。(#117b/173766247

版本 2.3.3

版本 2.3.3

2021 年 1 月 27 日

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

bug 修复

  • 现在,在 NavBackStackEntry 的 Lifecycle 变为 CREATED 之前弹出 NavBackStackEntry 时,不会再发生崩溃。(Ie3ba3)
  • 修复了由 b/171364502 引起的回归问题,具体为导航至动画资源值为 0 的 activity 会导致 ResourceNotFoundException 错误。(I7aedbb/176819931

版本 2.3.2

版本 2.3.2

2020 年 12 月 2 日

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

bug 修复

  • 修复了 NavigationUI 中的一个回归问题,即使用带有 onNavDestinationSelected<activity> 目标位置无法导航到 Activity。(I22e34b/171364502
  • 修复了 navigation-dynamic-features-fragment 会导致多次导航到新安装的目标位置的问题。(aosp/1486056b/169636207
  • 修复了以下问题:使用 launchSingleTop 时,默认参数无法发送到 OnDestinationChangedListener 实例。(I2c5cb)
  • 修复了以下问题:导航到嵌套导航图时,系统不会在返回堆栈上创建新的图表实例。(Ifc831)
  • 修复了以下问题:将 navigate() 与已移除导航图中的最后一个目的地的 popUpTo 一起使用时,不会立即销毁并从返回堆栈中移除导航图本身。(I910a3)
  • Navigation SafeArgs 现在使用 KotlinPoet 版本 1.7.2,后者添加了对 Kotlin 的显式 API 模式的支持。(I918b5)
  • 除了对 Fragment 层次结构和 Fragment 的视图层次结构的现有检查以外,NavHostFragment.findNavController(Fragment) 现在还会检查 DialogFragment 的 root decor 视图。这样,您便可以通过 FragmentScenarioNavigation.setViewNavController() 测试使用 Navigation 的对话框 fragment。(I69e0d)

版本 2.3.1

版本 2.3.1

2020 年 10 月 14 日

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

新功能

  • 默认 Animator 资源已添加到 Navigation UI,建议使用该资源,而不是默认动画资源。(b/167430145)
  • NavOptions 现在替换了哈希代码和 equals 方法 (b/161586466)
  • 现在 Navigation 会在“无带 ID 的目标”IllegalArgumentException 中包含当前目标,这应该会改进开发者的调试体验。(b/168311416)

bug 修复

  • Safe Args 将不再封装返回行,即使生成的参数类名称的长度超过 100 个字符也是如此。(b/168584987)

依赖项变更

  • navigation-ui 现在依赖于 DrawerLayout 1.1.1,从而确保即使是在使用 LOCK_MODE_LOCKED_CLOSEDLOCK_MODE_LOCKED_OPENNavigationUI 也能够打开抽屉式导航栏。(b/162253907)
  • Safe Args 现在依赖于 KotlinPoet 1.6.0 (aosp/1435911)
  • Safe Args 现在依赖于 AGP 4.0.1 (aosp/1442337)

版本 2.3.0

版本 2.3.0

2020 年 6 月 24 日

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

自 2.2.0 以来的重要变更

  • 功能模块集成:借助 navigation-dynamic-features-runtimenavigation-dynamic-features-fragment 制品,您可以导航到功能模块中定义的目标,从而根据需要自动处理功能模块的安装。如需了解详情,请参阅使用功能模块进行导航
  • 导航测试navigation-testing 制品提供了一个 TestNavHostController,可用于设置当前目标并在导航操作后验证返回堆栈。如需了解详情,请参阅测试导航
  • 返回结果:现在,通过与 Navigation 返回堆栈中的每个目标相关联的 NavBackStackEntry,您可以使用 SavedStateHandle,它适用于存储少量应与特定返回堆栈条目相关联的已保存状态。如需了解详情,请参阅向上一个目的地返回结果
  • OpenableNavigationUI 支持:使用 NavigationUIDrawerLayout 的所有情况都已替换为使用更通用的 Openable 接口,该接口已添加到 CustomView 1.1.0 中,并由 DrawerLayoutDrawerLayout 1.1.0 中实现。
  • 深层链接中的操作和 MIME 类型支持:深层链接现已经过扩展,除了之前可用的 app:uri 之外,还支持 app:actionapp:mimeTypeNavController 现在支持通过新的 NavDeepLinkRequest 类按这些字段的任意组合进行导航。如需了解详情,请参阅使用 NavDeepLinkRequest 导航

已知问题

  • 清单合并尚不提供对深层链接操作和 MIME 类型的支持。在提供支持之前,从清单的 <nav-graph> 元素生成的任何 <intent-filter> 元素都不会在其 <data> 元素或您的自定义 <action> 中包含您的 MIME 类型。您必须手动在清单中添加相应的 <intent-filter>

版本 2.3.0-rc01

2020 年 6 月 10 日

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

bug 修复

  • 修复了在使用 singleTop 将不含参数的目标的实例替换为包含参数的其他实例时发生的 NullPointerException(b/158006669)
  • NavController 抛出的所有 destination is unknown 异常现在包含额外的调试信息,可帮助确定 NavController 的状态。(b/157764916)

版本 2.3.0-beta01

2020 年 5 月 20 日

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

bug 修复

  • 修复了进程终止后 NavBackStackEntryLifecycle 无法正确更新的问题。(b/155218371)
  • 现在进程终止后,可向在调用 setGraph() 之前注册的 OnDestinationChangedListener 实例正确发送恢复的目标。(b/155218371)
  • 现在使用 singleTop 时,NavBackStackEntry 会正确更新其参数,且更新后的参数会发送给所有 OnDestinationChangeListener 实例。(b/156545508)

依赖项更新

版本 2.3.0-alpha06

2020 年 4 月 29 日

发布了 androidx.navigation:navigation-*:2.3.0-alpha06。(版本 2.3.0-alpha06 中包含这些提交内容。

新功能

  • 深层链接已经过扩展,除了之前可用的 app:uri 之外,还支持 app:actionapp:mimeType。NavController 现在支持通过新的 NavDeepLinkRequest 类按这些字段的任意组合进行导航。(b/136573074b/135334841

API 变更

  • 极大地扩展了对 Dynamic Navigation 目标的 Kotlin DSL 支持。(b/148969800)

bug 修复

  • 修复了使用嵌套起始目标时深层链接 intent 会被忽略的问题。(b/154532067)

版本 2.3.0-alpha05

2020 年 4 月 15 日

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

新功能

  • 对于使用 <include-dynamic>所包含动态图,您不需要再指定 app:graphPackage,只需在点后为 applicationId 添加 moduleName 后缀,系统即会使用默认的软件包。如果您需要自定义 graphPackage,现在可以使用 ${applicationId} 占位符。(b/152696768)
  • Navigation Graph Kotlin DSL 现在可公开操作的 defaultArguments Map,从而镜像在 Navigation XML 文件中为 <action> 元素设置默认值的功能。(b/150345605)

bug 修复

  • Navigation 2.2.2 开始:修复了如果 Activity 中有多个 NavHostFragment 实例,深层链接到图的起始目的地时的 IllegalStateException。(b/147378752)

依赖项更新

版本 2.3.0-alpha04

2020 年 3 月 18 日

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

新功能

  • 添加了对采用 Navigation Kotlin DSL 的功能模块 Activity 和 Fragment 目标的支持。(b/148969800)

API 变更

  • DynamicExtras 类不再使用构建器模式,现在可以直接构建。(aosp/1253671)
  • 现在,DynamicActivityNavigator 可以在其构造函数(而非 Activity)中获取 Context。(aosp/1250252)

bug 修复

  • NavigationUI 不再忽略空标签(即包含 android:label=”” 的目的地),现在可以正确将标题设置为空字符串。(b/148679860)

依赖项更新

  • Navigation Dynamic Features 制品现在依赖于 Play Core 1.6.5。(b/149556401)

版本 2.3.0-alpha03

2020 年 3 月 4 日

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

API 变更

  • 现在,AppBarConfiguration 不再依赖于具体的 DrawerLayout 类,而是使用 CustomView 1.1.0-alpha02 中引入的 Openable 接口(从 DrawerLayout 1.1.0-alpha04 开始,DrawerLayout 会实现该接口),从而允许您将 Openable 的自定义实现与 NavigationUI 一起使用。(b/129030452)

bug 修复

  • 现在,navigation-common-ktx ProGuard 规则只会正确保留使用的 NavArgs 类,而非所有 NavArgs 实例。(b/150213558)

依赖项变更

  • Navigation 已还原其在 Core 1.2.0 方面的依赖项,现在依赖于 Core 1.1.0,以避免在 Navigation 不依赖于 Core 1.2.0 中的新 API 时,强迫开发者移至更高版本的依赖项。

版本 2.3.0-alpha02

2020 年 2 月 19 日

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

新功能

  • NavBackStackEntry 现在允许您访问 SavedStateHandle,它适合存储少量应与特定返回堆栈条目相关联的已保存状态。有关示例用例,请参阅返回结果。(b/79672220)

API 变更

  • 添加了 getCurrentBackStackEntry()getPreviousBackStackEntry() 的简便方法,以便更轻松地检索 NavBackStackEntry 获取当前和之前的目的地。(b/79672220)

bug 修复

  • 现在,在您自己的任务堆栈上启动应用时,navigateUp() 会将当前目的地的参数和 KEY_DEEP_LINK_INTENT 传递到之前的目的地。(b/147456890)

依赖项变更

版本 2.3.0-alpha01

2020 年 2 月 5 日

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

新功能

  • 新的 navigation-testing 制品提供了 TestNavHostController 类。该类提供了测试 Navigation 时使用模拟 NavController 的替代方法,该方法可让您设置当前目的地,并在导航操作后验证返回堆栈。(b/140884273)
  • 新的 navigation-dynamic-features-fragment(及其传递依赖项 navigation-dynamic-features-runtime)可让您通过 <include-dynamic> 添加功能模块中的目标或整个导航图,从而在导航到相应目标时,实现按需功能模块无缝安装。如需了解详情,请参阅使用功能模块进行导航。(b/132170186)

bug 修复

  • Navigation 2.2.1 起:没有查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随 {argument} 元素或不匹配深层链接。(b/147447512)
  • Navigation 2.2.1 开始:更新了 DrawerArrowDrawablenavigation-ui ProGuard 规则,以确保不需要 android.enableJetifier=true。(b/147610424)
  • Navigation 2.2.1 开始:navigation-common-ktx 模块现在具有唯一的清单软件包名称,而不是与 navigation-runtime-ktx 共用相同的清单软件包名称。(aosp/1141947)

依赖项更新

版本 2.2.2

版本 2.2.2

2020 年 4 月 15 日

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

bug 修复

  • 修复了如果 Activity 中有多个 NavHostFragment 实例,深层链接到图的起始目的地时的 IllegalStateException。(b/147378752)
  • NavigationUI 不再忽略空标签(即包含 android:label=”” 的目的地),现在可以正确将标题设置为空字符串。此修复已在之前的 Navigation 2.3.0-alpha04 中发布。(b/148679860)
  • 现在,navigation-common-ktx ProGuard 规则只会正确保留使用的 NavArgs 类,而非所有 NavArgs 实例。此修复已在之前的 Navigation 2.3.0-alpha03 中发布。(b/150213558

依赖项更新

版本 2.2.1

版本 2.2.1

2020 年 2 月 5 日

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

bug 修复

  • 没有查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随 {argument} 元素或不匹配深层链接。(b/147447512)
  • 更新了 DrawerArrowDrawablenavigation-ui ProGuard 规则,以确保不需要 android.enableJetifier=true。(b/147610424)
  • navigation-common-ktx 模块现在具有唯一的清单软件包名称,而不是与 navigation-runtime-ktx 共用相同的清单软件包名称。(aosp/1141947)

依赖项更新

版本 2.2.0

版本 2.2.0

2020 年 1 月 22 日

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

自 2.1.0 以来的重要变更

  • NavBackStackEntry:您现在可以调用 NavController.getBackStackEntry(),并传入返回堆栈中的目标或导航图表的 ID。返回的 NavBackStackEntry 除了提供用于启动该目标的参数,还提供 Navigation 驱动的 LifecycleOwnerViewModelStoreOwner(与 NavController.getViewModelStoreOwner() 返回的相同)和 SavedStateRegistryOwner
  • Lifecycle ViewModel SavedState 集成:现在将 by navGraphViewModels()ViewModelProvider 构造函数与 NavController.getBackStackEntry()NavController.getViewModelStoreOwner() 返回的 ViewModelStoreOwner 一起使用时,会使用 SavedStateViewModelFactory 作为默认出厂设置。
  • 深层链接的查询参数支持:具有查询参数的深层链接现在支持重新排序的查询参数;现在在匹配深层链接时,具有默认值或可为 null 的参数为可选参数。
  • 改进了动画支持NavHostFragment 现在使用 Fragment 1.2.0 中的 FragmentContainerView,这解决了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。

版本 2.2.0-rc04

2019 年 12 月 18 日

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

bug 修复

版本 2.2.0-rc03

2019 年 12 月 4 日

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

bug 修复

  • 修复了以查询参数和一个实参作为路径最后一部分时存在的深层链接解析问题,此问题会导致最终路径实参中的多个字符无法解析。(b/144554689)
  • 修复了可选参数会收到 "@null"(而非 null)的深层链接解析问题。(b/141613546)
  • 现在,如果将 NavHostFragmentFragmentContainerView 配合使用,前者可在配置发生更改后正确恢复图表。(b/143752103)

依赖项变更

  • Navigation 现在会视情况依赖于 Lifecycle 2.2.0-rc03、Lifecycle ViewModel SavedState 1.0.0-rc03、Activity 1.1.0-rc03 和 Fragment 1.2.0-rc03

版本 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)

bug 修复

  • 修复了以下问题:如果还指定了查询参数,深层链接路径中的实参将被忽略。(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版本 2.2.0-alpha03 中包含这些提交内容

行为变更

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

bug 修复

  • 修复了在使用 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

bug 修复

  • 修复了将 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 变更

bug 修复

  • 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。点击此处可查看此版本中包含的提交内容。

bug 修复

  • 移除了在 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)

bug 修复

  • 修复了通过 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,现在所有 <dialog> 目标都可以实现该接口。用于与顶部应用栏交互的 NavigationUI 方法现在会忽略 FloatingWindow 目标。(b/133600763)

行为变更

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

bug 修复

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

版本 2.1.0-alpha05

2019 年 6 月 5 日

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

API 变更

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

bug 修复

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

版本 2.1.0-alpha04

2019 年 5 月 16 日

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

bug 修复

  • 在拦截系统返回按钮事件时,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() 方法,以便您更清楚地了解,这是创建子类 NavHostFragment 时添加自定义导航器的正确入口点。b/122802849
  • hasDeepLink() 方法添加到了 NavDestination,以便检查给定的 Uri 是否可由给定的目标处理,或者在有 NavGraph 的情况下,否可由导航图表中的任何目标处理。b/117437718

bug 修复

  • 默认参数现在将正确传递到 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

bug 修复

  • <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

bug 修复

  • 有附加到目标的参数时,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 稳定版的第二个候选版本。此版本修复了很多问题。

bug 修复

  • 修复了在根图没有 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 稳定版的候选版本。此版本修复了一个问题。

bug 修复

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

版本 1.0.0-beta02

2019 年 2 月 12 日

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

新功能

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

行为变更

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

bug 修复

  • 当返回堆栈上弹出最后一个目标时,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

bug 修复

  • 现在,可以在所有版本的 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 的问题。

bug 修复

  • 修复了 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 插件使用的构建器模式。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

bug 修复

  • 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 年 Android 开发者峰会的 Single 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

bug 修复

  • 参数现在可以从深层链接中正确解析为正确的 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

bug 修复

  • 当目标是 <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

bug 修复

  • 深层链接现在可以正确解析查询参数。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

bug 修复

  • 与来自各个目标的视图一起使用时,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 日

bug 修复

  • 修复了导致返回堆栈行为不正确的 bug。b/111907708
  • 修复了生成的 Args 类的 equals() 中的 bug。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 变更、行为变更和 bug 修复。

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

bug 修复

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

版本 1.0.0-alpha03

2018 年 7 月 12 日

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

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

bug 修复

  • 修复了在 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

bug 修复

  • 修复了在从 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