导航

导航是一个用于在 Android 应用中的“目的地”之间导航的框架,无论目的地是作为片段、活动还是其他组件实现,它都提供一致的 API。
最新更新 稳定版本 发布候选版本 Beta 版本 Alpha 版本
2024 年 9 月 4 日 2.8.0 - - -

声明依赖项

要添加对导航的依赖项,您必须将 Google Maven 存储库添加到您的项目中。阅读 Google 的 Maven 存储库 以了解更多信息。

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

Groovy

dependencies {
  def nav_version = "2.8.0"

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

  // Views/Fragments Integration
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Feature module support for Fragments
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

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

}

Kotlin

dependencies {
  val nav_version = "2.8.0"

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

  // Views/Fragments integration
  implementation("androidx.navigation:navigation-fragment:$nav_version")
  implementation("androidx.navigation:navigation-ui:$nav_version")

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

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

}

安全参数

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

Groovy

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

Kotlin

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.8.0"
        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")
}

您必须在您的 gradle.properties 文件 中具有 android.useAndroidX=true,如 迁移到 AndroidX 所述。

有关使用 Kotlin 扩展的信息,请参阅 ktx 文档

有关依赖项的更多信息,请参阅 添加构建依赖项

反馈

您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请查看此库中 现有问题。您可以通过单击星形按钮为现有问题添加您的投票。

创建新问题

有关更多信息,请参阅 问题跟踪器文档

版本 2.8

版本 2.8.0

2024 年 9 月 4 日

androidx.navigation:navigation-*:2.8.0 已发布。版本 2.8.0 包含 这些提交

自 2.7.0 以来的重要更改

导航 Kotlin DSL 类型安全

  • 导航现在通过 Kotlin 序列化为 Kotlin DSL(由 Navigation Compose 使用)提供类型安全,允许您通过类型安全的对象和数据类在导航图中定义目的地
    // 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 meet Type Safety 博客文章

Navigation Compose 预测性返回

  • 导航 Compose 现在通过 compose-animation 中的新 SeekableTransitionState API 提供对预测性应用内后退的支持。这允许您使用后退手势在决定是否通过完成的手势提交事务或取消之前,使用自定义过渡查看上一个目的地。

导航片段可组合

  • 添加了一个新的 navigation-fragment-compose 工件,其中包含一个 ComposableNavHostFragment,它可以作为 NavHostFragment 的替代方案,允许您将可组合的目的地添加到导航 XML 文件中。每个 composable 目的地必须表示为顶级、无参数的 @Composable 方法,其完全限定名称用作每个目的地的 android:name 属性。当导航到这些目的地之一时,会创建一个包含片段来显示可组合的内容。
  // 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" />

其他更改

  • 导航 Compose 现在依赖于 Compose 1.7.0。
  • 导航现在提供了一个新的 CollectionNavType<T> 类,它是 NavType<T> 的子类,用于基于集合的参数,例如列表、数组、映射。所有默认的 NavType 数组(IntArrayTypeLongArrayTypeFloatArrayTypeBoolArrayTypeStringArrayType)现在都继承了这个新类。
  • NavType 现在对 Int、String、Boolean、Float 和 Long 的列表有内置支持。

版本 2.8.0-rc01

2024 年 8 月 21 日

androidx.navigation:navigation-*:2.8.0-rc01 已发布。版本 2.8.0-rc01 包含 这些提交

错误修复

  • 修复了将顶级枚举类作为类型安全参数传递时导航崩溃的问题。(I0ba76b/358137294)
  • 导航 2.8 现在可以与 SDK 34 正确配合使用,并且在 2.9 版本发布以及其他 AndroidX 库发布之前,不会切换到 SDK 35。(b/358798728)

版本 2.8.0-beta07

2024 年 8 月 7 日

androidx.navigation:navigation-*:2.8.0-beta07 已发布。版本 2.8.0-beta07 包含 这些提交

已知问题

  • 由于 b/358137294,默认情况下只支持嵌套在其他类中的枚举。顶级枚举将在下一个版本中得到支持。

错误修复

  • 当导航到重复或共享的目的地时,导航将优先导航到从当前位置在图中最近匹配的目的地。(Ic89a4b/352006850)
  • 导航中的安全参数现在添加了一个新的 NavType.EnumType。这意味着 Enum 类型不再需要自定义的 NavType。请注意,EnumSerialName 必须是默认的完全限定名称。(I66d22b/346475493)
  • 导航中的安全参数添加了对可空参数类型的内置支持,包括 Int?Long?Float?Boolean?Enum<*>?。(I32d13I1c580Ifba66I978b0Ide076b/351994237)
  • NavGraphstartDestination 现在将使用默认参数值(如果传递给 NavGraphstartDestination 路由与 startDestination.route 完全相同)。(I13762b/354046047)

版本 2.8.0-beta06

2024 年 7 月 24 日

androidx.navigation:navigation-*:2.8.0-beta06 已发布。版本 2.8.0-beta06 包含 这些提交

错误修复

  • 修复了 WrongStartDestinationType lint 检查未检查传递的类类型上的伴随对象,导致 lint 无法检测到错误的问题。(I92b09)

版本 2.8.0-beta05

2024 年 7 月 10 日

androidx.navigation:navigation-*:2.8.0-beta05 已发布。版本 2.8.0-beta05 包含 这些提交

错误修复

  • 修复了当嵌套的 NavGraphs 共享相同的 startDestination 路由时,singleTop 导航崩溃的问题。(I17b94b/294408596)

版本 2.8.0-beta04

2024 年 6 月 26 日

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

错误修复

  • 导航现在支持使用路径参数中的空字符串进行导航。(Ic5dbdb/339481310)
  • 改进了通过 @Serializable(with =...) 直接在类字段上声明的自定义序列化程序的错误消息,以明确指出这目前是不支持的功能。(I052b0b/341319151)
  • SavedStateHandleFactory 测试 API 现在可以在非 Android 测试中使用,但需要 Robolectric 支持使用 Bundle 进行参数解析。(I76cdcb/340966212)
  • 修复了在使用 Compose 中的类型安全导航时,在进程死亡后恢复应用程序时从恢复状态导致的崩溃。(Ia8f38b/341801005)
  • 修复了导航 Compose 中的一个问题,在取消预测性后退手势后,用户返回到的 NavBackStackEntry 永远不会返回到 RESUMED 生命周期的状态。这还确保返回的目的地正确地动画回,而不是在轻扫后立即出现。(I97a0cb/346608857)
  • 当使用导航 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)

错误修复

  • 添加了关于 NavType.serializeAsValueserializeAsValues 的文档,以突出显示最终输出应为 URI 编码。(Ida6bdb/344943214)
  • 修复了当使用 CollectionNavType 参数调用 toRoute<T> 时发生的崩溃。当使用空 CollectionNavType 进行导航时,输出参数将是您可序列化类中声明的默认值,或者是在没有默认值的情况下 emptyCollection() 的返回值。(I84158Id630fb/342672856)

版本 2.8.0-beta02

2024 年 5 月 29 日

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

错误修复

  • 修复了当使用 NavBackStackEntry.toRoute 和可空的自定义 NavType 时发生的 ClassCastException 崩溃。(I1c29bb/342239473)
  • 修复了在尝试恢复当前目的地无法通过 id 访问的后退堆栈条目时导致的导航后退堆栈状态恢复问题。由于路由由 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)

错误修复

  • 已添加导航 Kotlin DSL 函数的缺少参数文档。(I26a36)

版本 2.8.0-alpha08

2024 年 5 月 1 日

androidx.navigation:navigation-*:2.8.0-alpha08 已发布。版本 2.8.0-alpha08 包含 这些提交

导航 Compose 中的安全参数

此功能使用 Kotlin Serialization 允许您通过类型安全的对象和数据类在导航图中定义目标。

  // 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 meet Type Safety 博客文章

新功能

  • navigation-fragment-compose 工件现在提供一个 LocalFragment,它在 ComposableFragment 中的 Composable 方法中是本地可组合的。 (If35e5)
  • NavType 现在对 Int、String、Boolean、Float 和 Long 的列表有内置支持。 (I4b6dd, Ia914c, b/188693139)

版本 2.8.0-alpha07

2024 年 4 月 17 日

androidx.navigation:navigation-*:2.8.0-alpha07 已发布。版本 2.8.0-alpha07 包含 这些提交

新功能

  • 添加了一个新的 navigation-fragment-compose 工件,其中包含一个 ComposableNavHostFragment,它是 NavHostFragment 的替代方案,它允许您将 composable 目标添加到您的 Navigation XML 文件中。每个 composable 目标必须表示为一个顶层、无参数的 @Composable 方法,其完全限定名用作每个目标的 android:name 属性。当导航到这些目标之一时,将创建一个包含片段以显示可组合的内容。 (I0ef2e, b/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 更改

版本 2.8.0-alpha06

2024 年 4 月 3 日

androidx.navigation:navigation-*:2.8.0-alpha06 已发布。版本 2.8.0-alpha06 包含 这些提交

API 更改

错误修复

  • NavHost 现在使用 Alignment.TopStart 作为默认的 contentAlignment 参数。这与 AnimatedContent 的默认值一致,并修复了从中心过渡的意外缩放的一些实例。 (I09e72, b/330111602)
  • 当使用 Navigation Compose 时,在弹动预测后退手势时,NavHost 现在将正确地完成自定义过渡,而不是立即完成。 (I99017, b/327292110)

版本 2.8.0-alpha05

2024 年 3 月 20 日

androidx.navigation:navigation-*:2.8.0-alpha05 已发布。版本 2.8.0-alpha05 包含 这些提交

新功能

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

API 更改

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

错误修复

  • 深层链接中的查询参数现在允许使用大括号包围参数名(即 {argName})的值作为基于字符串的 NavTypes 的有效值。这修复了一个问题,即此类值将被认为对所有类型都是无效的(或不存在值)。 (I18302, b/327274038)
  • 支持路由的 NavController 函数(例如 navigatepopBackStack)现在可以正确匹配填充了 Array NavTypes 参数的路由。 (Iea805, b/327229511)

版本 2.8.0-alpha04

2024 年 3 月 6 日

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

新功能

  • 您现在可以通过将它们定义为 composable 和/或 navigation 函数的初始化的一部分来指定过渡中的 SizeTranform。 (I91062, b/296912651)

错误修复

  • 修复了在 Compose Navigation 中 NavHost 在没有手势的情况下使用系统后退时无法正确显示过渡的问题。 (Iceeae, b/325998468)

版本 2.8.0-alpha03

2024 年 2 月 21 日

androidx.navigation:navigation-*:2.8.0-alpha03 已发布。 版本 2.8.0-alpha03 包含这些提交。

API 更改

  • NavBackStackEntry.savedStateHandle 现在标记为 @MainThread,因为它使用了无论如何都需要在主线程上运行的代码。 (Ibb988, b/299523245)

错误修复

  • 修复了 Navigation 中导致 NavGraph ViewModels 过早 DESTROYED 的问题,因为关联的条目的 ViewModel 不是保存状态的一部分。 (Ib6bb7, b/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 包含以下提交。

错误修复

  • 修复了 BackStackState 泄漏问题,其中在目标上多次调用 saveState 会导致保存多个状态,但只有第一个状态可以恢复。 (I598b0, b/309559751)
  • 修复了使用 NavigationUI 辅助函数填充应用栏标题时,非字符串参数无法正确显示的问题。 (#636, b/316676794)

依赖项更新

外部贡献

  • 感谢 SimonMarquis 修复了使用 NavigationUI 辅助函数填充应用栏标题时,非字符串参数的显示问题。

版本 2.7.7

版本 2.7.7

2024 年 2 月 7 日

androidx.navigation:navigation-*:2.7.7 已发布。 版本 2.7.7 包含以下提交。

错误修复

  • Navigation 2.8.0-alpha01 回溯:修复了 BackStackState 泄漏问题,其中在单个 NavBackStackEntry 上多次调用 saveState() 会导致保存多个状态,但只有第一个保存的状态可以恢复。 (I598b0, b/309559751)
  • Navigation 2.8.0-alpha01 回溯:修复了使用 NavigationUI 辅助函数填充应用栏标题时,非字符串参数无法正确显示的问题。 (#636, b/316676794)

外部贡献

  • 感谢 SimonMarquis 修复了使用 NavigationUI 辅助函数填充应用栏标题时,非字符串参数的显示问题。

版本 2.7.6

版本 2.7.6

2023 年 12 月 13 日

androidx.navigation:navigation-*:2.7.6 已发布。 版本 2.7.6 包含以下提交。

错误修复

  • NavGraphequals() 函数现在会正确考虑另一个图的节点,而不仅仅是调用者自身。这将确保具有不同 ID 节点的图不再被视为相等。 (I401cb, b/311414915)

版本 2.7.5

版本 2.7.5

2023 年 11 月 1 日

androidx.navigation:navigation-*:2.7.5 已发布。 版本 2.7.5 包含以下提交。

性能改进

  • 大幅提升了比较两个图的性能(时间和分配数量方面)。这意味着诸如 setGraph 之类的调用(内部比较新图和现有图)速度更快,并且导致更少的跳帧。感谢 Michał Z 的彻底分析,这带来了此次改进。 (I6ad62)
  • NavHost 现在将在第一次合成传递中渲染起始目标,而不是需要等待第二次传递来读取更新的状态。 (I439a7, b/304852206)

错误修复

  • 修复了在你的图中包含链接两个目标的操作的情况下,如果使用完全相同的图多次调用 setGraph,你的回退栈会弹出的问题。 (Ieaed7)
  • 快速连续导航到并关闭的对话框将不再泄漏到 NavController.visibleEntries 列表中。 (I67586, b/287969970)
  • 在弹出一个条目后接着发生配置更改时,如果 saveState 为 false,则该条目的 ViewModel 现在将被正确清除。 (Idf242, b/298164648)
  • 修复了如果回退栈在配置更改或调用 setGraph 之前完全为空,并且只有当传入的 Intent 设置了 FLAG_ACTIVITY_NEW_TASK 标志时,NavController 可能会多次处理相同的深层链接的问题。 (I73c7f)

依赖更新

  • 带有片段的导航现在依赖于 Fragment 1.6.2,修复了调用 clearBackStack 时嵌套片段的 ViewModel 实例不会被清除的问题。

版本 2.7.4

版本 2.7.4

2023 年 10 月 4 日

androidx.navigation:navigation-*:2.7.4 已发布。 版本 2.7.4 包含以下提交。

新功能

  • 添加了对 popUpTo 的支持,以使用带有参数的路由,允许弹出回使用这些确切参数的特定条目,与在 popBackStack 中找到的支持匹配。 (I731f4, b/299255572)

错误修复

  • 修复了使用另一个带有 popUpTo 的导航中断导航时导致 FragmentNavigator 崩溃的问题。 (I3c848, b/301887045)
  • 修复了系统后退键导致 currentDestination 未正确更新以匹配显示的片段的问题。 (Id0d6c, b/289877514)
  • DialogFragment 的生命周期现在将在它上方的对话框关闭时正确地进入 RESUMED 状态。 (I88f0d, b/301811387)

版本 2.7.3

版本 2.7.3

2023 年 9 月 20 日

androidx.navigation:navigation-*:2.7.3 已发布。 版本 2.7.3 包含以下提交。

错误修复

  • 修复了带有片段的导航中导致 visibleEntries 列表包含不正确条目的问题。 (I5caa9, b/288520638)
  • 修复了导致浮动窗口目标(例如 DialogsBottomsheets 等)永远不会获得 RESUMED 生命周期回调的问题。 (I3b866, b/287505132)

版本 2.7.2

版本 2.7.2

2023 年 9 月 6 日

androidx.navigation:navigation-*:2.7.2 已发布。 版本 2.7.2 包含以下提交。

错误修复

  • 导航现在依赖于 Lifecycle 2.6.2,修复了 rememberSaveable 和 Navigation Compose 的 NavHost 之间的交互问题,该问题会导致目标的 rememberSaveable 状态和任何 ViewModel 拥有的 SavedStateHandle 实例在进程死亡和重新创建后无法正确恢复。 (b/298059596, b/289436035)
  • 修复了在 Navigation Compose 中同时显示多个对话框时,部分遮挡的对话框(例如,不是最顶层的对话框)将处于 CREATED 生命周期状态而不是 STARTED 状态的问题。 (aosp/2728520, b/289257213)
  • 修复了在 Navigation Compose 中同时显示多个对话框时,关闭最顶层的对话框会导致新的最顶层对话框卡在 STARTED 生命周期状态而不是正确地进入 RESUMED 状态的问题。 (aosp/2629401, b/286371387)
  • Navigation Safe Args 现在如果实际上没有被执行,就不会急切地实例化它的任务。 (I0e385, b/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 包含以下提交。

错误修复

  • 修复了 Navigation with Compose 中的问题,在使用 Scaffold 时,可能会出现尝试访问 Lifecycle.State.DESTROYED ViewModel 的错误。 (I1dc11, b/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)

错误修复

  • Navigation Compose 中的 NavHost 现在可以正确拦截系统后退调用,即使在 Activity 被 STOPPED 和 RESUMED 之后也是如此。 (Icb6de, b/279118447)

依赖更新

  • 导航现在依赖于 Compose 1.5.0,从 1.1.0 开始。

版本 2.7.0-rc01

2023 年 7 月 26 日

androidx.navigation:navigation-*:2.7.0-rc01 已发布。 版本 2.7.0-rc01 包含这些提交。

错误修复

  • 修复了 EnterTransitionExitTransition lambda 表达式(作为 NavHost 的一部分创建)即使在 NavHost 从组合中移除后也可能保留在内存中的问题。 (I893d0)

已知问题

  • 导航 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 包含这些提交。

错误修复

  • 导航 Compose 现在为使用 popUpTo 选项的 navigate 进行自定义过渡提供了正确的 z 顺序。(/Ib1c3a, b/285153947)

版本 2.7.0-beta01

2023 年 6 月 7 日

androidx.navigation:navigation-*:2.7.0-beta01 已发布。 版本 2.7.0-beta01 包含这些提交。

错误修复

  • 导航 Compose 中的 NavHost 现在可以正确拦截系统后退调用,即使在 ActivitySTOPPEDRESUMED 之后。 (Icb6de, b/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)

错误修复

  • Navigation 2.6.0-rc02 开始:修复了 Navigation 在 Fragments 中使用 popUpTo 进行导航以及在不重新创建视图的情况下从回退栈中弹出 Fragment 导致系统后退停止工作的问题。 (Ieb8d4, b/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 将值序列化为字符串,允许在 NavType 类中完全封装序列化和反序列化(通过 parseValue)。 StringType 现在覆盖此方法以对给定的 String 调用 Uri.encode

自 2.5.0 以来 Navigation Compose 的重要更改

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

自 2.5.0 以来 Navigation with Fragments 的重要更改

  • NavHostFragment 不再自行拦截系统后退按钮。 这允许底层的 FragmentManager 处理系统后退。 这允许 Fragment 1.7.0-alpha01 及更高版本在 Android U 设备上提供应用内预测后退动画。
  • 在使用 Navigation with Fragments 时,尝试手动执行 FragmentTransaction 将 Fragment 添加到 FragmentManager 的回退栈中现在将抛出 IllegalArgumentException。 您应该始终通过 navigate() API 添加 Fragment。
  • 在使用导航 XML 文件的活动元素中的 app:dataapp:dataPattern 属性中使用精确字符串 ${applicationId} 作为占位符时,占位符将在膨胀时自动填充为上下文的 packageName
  • FragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用过渡 API。 这意味着 NavBackStackEntry Lifecycle 现在将在进入和退出 Fragment 的特殊效果完成之前等待,然后再将其最终的 Lifecycle.State 移动。
  • DialogFragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用过渡 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 集成现在将解析在导航 XML 文件中 android:label 中找到的 ReferenceType 参数的 R.string 值,并将它们转换为字符串值,而不是输出自动生成的资源整数。
  • NavigationUI 现在在无法通过选定的 MenuItem 进行导航时提供日志。

版本 2.6.0-rc02

2023 年 5 月 24 日

androidx.navigation:navigation-*:2.6.0-rc02 已发布。 版本 2.6.0-rc02 包含这些提交。

错误修复

  • 修复了 Navigation 在 Fragments 中使用 popUpTo 进行导航以及在不重新创建视图的情况下从回退栈中弹出 Fragment 导致系统后退停止工作的问题。 (Ieb8d4, b/281726455)

版本 2.6.0-rc01

2023 年 5 月 10 日

androidx.navigation:navigation-*:2.6.0-rc01 已发布。 版本 2.6.0-rc01 包含这些提交。

错误修复

  • 修复了 Navigation 在 Fragments 中存在的一个问题,使用 popUpTo 在其 onResume() 生命周期回调中通过 navigate 移除 Fragment 将导致 IllegalStateException。 (I21884, b/279644470)

版本 2.6.0-beta01

2023 年 4 月 19 日

androidx.navigation:navigation-*:2.6.0-beta01 已发布。 版本 2.6.0-beta01 包含这些提交。

新功能

  • NavBackStackEntry 现在提供了一个自定义的 toString 实现。 (Iff00b)

错误修复

  • 在使用 Navigation with Fragments 时,尝试手动执行 FragmentTransaction 将 Fragment 添加到 FragmentManager 的回退栈中现在将抛出 IllegalArgumentException。 您应该始终通过 navigate() API 添加 Fragment。 (I6d38e)
  • 当存在一个添加条目的 navigate 和一个在同一帧中将其移除的 popBackStack 时,回退栈上的最终顶部条目现在将始终恢复到 RESUMED Lifecycle.State。 (Id8067, b/276495952)

版本 2.6.0-alpha09

2023 年 4 月 5 日

androidx.navigation:navigation-*:2.6.0-alpha09 已发布。 版本 2.6.0-alpha09 包含这些提交。

错误修复

  • 修复了对无效路由的检查,这样如果一个 NavDestination 包含非空 NavArgument,这个目的地的路由必须包含与非空 NavArgument 相同名称的占位符。 (Ic62bf, b/274697949)
  • 基于 Action/MimeType 的深层链接导航现在将在导航操作缺少 Action/MimeType 匹配的 NavDestination 所需的非空 NavArgument 时失败。 (Ibfa17, b/271777424)
  • NavController 设置一个与之前图具有相同路由和目的地的图时,它现在会正确地用新实例替换其当前图节点及其后退栈目的地。这修复了在 Navigation Compose 中使用 onLaunchSingleTop 而不保存状态时发生的崩溃。这也修复了导航到与根图关联的目的地的错误,该错误会导致构建不正确的后退栈。 (I5bc58, b/275258161, b/275407804)

版本 2.6.0-alpha08

2023 年 3 月 22 日

androidx.navigation:navigation-*:2.6.0-alpha08 已发布。 版本 2.6.0-alpha08 包含以下提交。

新功能

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

错误修复

  • 修复了在弹出包含非空参数的嵌套图时发生的 NullPointerException。 (6b3581, b/249988437)
  • 在使用系统返回执行带有 popUpTo 的导航后,NavController 的状态将弹出到正确的条目。 (I3a8ec, b/270447657)
  • FragmentNavigator 现在将在通过系统返回或 popBackStack() 弹出后退栈时以及事务是否使用片段的特效来正确弹出条目。 (I81bdf)
  • 将片段添加到 FragmentNavigatorFragmentManager 中而不使用导航将不再导致崩溃。 (b17204, b/274167493)

依赖更新

版本 2.6.0-alpha07

2023 年 3 月 8 日

androidx.navigation:navigation-*:2.6.0-alpha07 已发布。 版本 2.6.0-alpha07 包含以下提交。

错误修复

  • 接受路由的 getBackStackEntrypopBackStackclearBackStack API 变体现在接受具有可空参数和可空查询参数的路由模式 (I22294, b/269302500)
  • 修复了从 NavController 调用 clearBackStack() 不会清除与已清除后退栈关联的片段管理器中的保存状态的问题。 (Ic1cce, b/271190202)
  • 修复了 2.6.0-alpha06 中的回归,该回归会导致在使用系统返回在标签之间切换时,BottomNavigationView 中的错误 MenuItem 被选中。 (I634f6, b/270447657)
  • 修复了 2.6.0-alpha06 中的回归,该回归会导致 NavBackStackEntry 在使用 Animation 时不会移动到 RESUMED 状态。 (Ib3589, b/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 进行注释,以确保它们在主线程上被调用。 (I2c0b0, b/263427111)

错误修复

  • 修复了在使用动态片段导航时尝试导航时发生的崩溃。 (I3ee29, b/268360479)
  • 修复了通过系统返回按钮导航到另一个片段时,底部栏不会更新到正确选定项的错误 (If559f, b/269044426)

已知问题

  • 在将 Navigation 与 Fragments 一起使用时,NavBackStackEntry 的 Lifecycle 在使用 Animation API 时无法达到 RESUMED。 (b/269646882)
  • 在将 Navigation 与 Fragments 一起使用时,以及使用 BottomNavigation 导航时,如果尝试恢复具有多个条目的后退栈,BottomMenuItem 不会被正确更新。 (b/270447657)
  • 在将 Navigation 与 Fragments 一起使用时,在恢复状态后,NavBackStackEntry Lifecycle 在其片段被 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) 现在都支持具有部分或完全填充参数的路由。注意,参数必须与条目的参数完全匹配。 (Iebd28, Ic678c, I3b37b, b/257514373)
  • FragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用过渡 API。这意味着 NavBackStackEntry Lifecycle 现在将等待进入和退出片段的特殊效果完成,然后再将其最终的 Lifecycle.State 移动到最终状态。 (I3cb19, b/238686802)
  • DialogFragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用过渡 API。这意味着 NavBackStackEntry Lifecycle 现在将等待 DialogFragment Lifecycle 移动到 DESTROYED,然后再移动到 DESTROYED 本身。 (I53ee5, b/261213893)

API 更改

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

错误修复

  • 导航器状态现在在使用 push/popWithTransition API 并且条目正在处理时将执行无操作。 (Iadbfa, b/261213893)
  • 在使用 launchSingleTop 以及嵌套的 NavGraph 时,从原始目的地到其 startDestination 的所有目的地将仅被正确地添加到后退栈的顶部。 (Id4bea, b/253256629)
  • 导航现在将正确地替换 DialogFragment 实例,当使用 launchSingleTop 标志设置为 true 导航到同一目的地时。 (I45b5a, b/149572817)
  • 导航 SafeArgs 在使用长度正好为 19 个字符的参数时,将不再导致编译错误。 (Id60bc, b/257110095)

版本 2.6.0-alpha04

2022 年 11 月 9 日

androidx.navigation:navigation-*:2.6.0-alpha04 已发布。 版本 2.6.0-alpha04 包含以下提交。

新功能

  • 现在,NavType 的自定义子类可以覆盖 serializeAsValue 以将值序列化为字符串,允许在 NavType 类中完全封装序列化和反序列化(通过 parseValue)。StringType 现在覆盖此方法以在给定的 String 上调用 Uri.encode。(Ie5213b/247637434
  • NavigationUI 现在在无法通过选定的 MenuItem 导航时提供日志。(I2af5ab/247730357

错误修复

  • 导航深层链接现在在图初始化时被延迟解析,而不是在图初始化时解析,这可以提高应用程序启动时的性能。(Iab0ab
  • 修复了在深层链接到具有空默认参数的目的地后向上导航导致崩溃的错误。(I51c24b/243183636

依赖项更新

  • 导航对动态功能模块的支持现在依赖于细粒度的 Play 功能交付库。(Ib4ddc
  • 导航安全参数现在依赖于 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 包含这些提交。

错误修复

  • 导航 2.5.3NavHost 将不再在没有可用于 Crossfade 合成的目的地时导致 NoSuchElementException。它现在将跳过合成。(Ieb46eb/253299416
  • 导航 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

错误修复

  • 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 文件的活动元素中的 app:dataapp:dataPattern 属性中使用确切的字符串 ${applicationId} 作为占位符时,占位符将在膨胀时自动填充上下文的 packageName。(Iaabdeb/234223561
  • 尝试使用 navDeepLink Kotlin DSL 创建一个空的 NavDeepLink 现在会导致 lint 警告,指示深层链接需要 uri、操作和/或 mimetype 才能有效。(I08d2fb/154038883

API 更改

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

行为更改

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

错误修复

  • 导航 2.5.2:动态导航现在会在导航到它们之前正确尝试安装来自其他模块的 Activity 目的地。(Ia2c16b/240292838
  • 导航 2.5.2:导航现在将在导航到同一目的地并设置 launchSingleTop 标志为 true 时正确替换 Fragment 实例。(I5a2f1b/237374580
  • 导航 2.5.2:修复了由导航到与新弹出的起始目的地共享父级的双重嵌套图导致的 IllegalStateException。(I9f7cbb/243778589

版本 2.5

版本 2.5.3

2022 年 10 月 24 日

androidx.navigation:navigation-*:2.5.3 已发布。版本 2.5.3 包含这些提交。

错误修复

  • NavHost 将不再在没有可用于 Crossfade 合成的目的地时导致 NoSuchElementException。它现在将跳过合成。(Ieb46eb/253299416
  • 修复了当目的地从后退栈中弹出时,保存的 Compose 状态(例如 rememberSaveable 的用法)未被遗忘且未被删除的问题。(I64949

版本 2.5.2

2022 年 9 月 7 日

androidx.navigation:navigation-*:2.5.2 已发布。版本 2.5.2 包含这些提交。

错误修复

  • 动态导航现在会在导航到它们之前正确尝试安装来自其他模块的 Activity 目的地。(Ia2c16b/240292838
  • 导航现在将在导航到同一目的地并设置 launchSingleTop 标志为 true 时正确替换 Fragment 实例。(I5a2f1b/237374580
  • 修复了由导航到与新弹出的起始目的地共享父级的双重嵌套图导致的 IllegalStateException。(I9f7cbb/243778589

依赖项更新

版本 2.5.1

2022 年 7 月 27 日

androidx.navigation:navigation-*:2.5.1 已发布。版本 2.5.1 包含这些提交。

错误修复

  • 导航安全参数 将不再在将 Bundle 中保存的自定义参数类型一起使用时导致生成类中的弃用警告。(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

导航安全参数

  • 导航安全参数 已将 Android Gradle 插件 依赖关系升级为依赖 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 包含这些提交。

错误修复

  • 修复了在使用 Navigation Compose NavHost 时,快速切换底部目标导致的崩溃问题。 (I3979a, b/234054916)
  • Navigation SafeArgs 在使用 applicationIdSuffix 和命名空间且没有 applicationIdapplicationId 和命名空间不同的情况下,将不再崩溃。 (I754b1, b/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> 元素中。(Ic15a5, b/178403185)

错误修复

  • NavHostDialogHost 中的可组合作用域现在按预期顺序释放,即内部可组合项在外部可组合项之前释放。 (I157e6)
  • Navigation SafeArgs 现在在 ArgumentsGenerationTask 中使用 PathSensitivity.RELATIVE,以允许缓存的可重定位性。这意味着缓存条目现在可以从 CI 构建重新用于本地构建。 (I5f67c, b/173420454)
  • UnrememberedGetBackStackEntryDetector lint 规则已更新,以确保围绕对 getBackStackEntry() 的调用的 remember 调用也传递了 NavBackStackEntry 对象作为键。(Ib7081, b/227382831)

版本 2.5.0-beta01

2022 年 4 月 20 日

androidx.navigation:navigation-*:2.5.0-beta01 已发布。 版本 2.5.0-beta01 包含这些提交。

错误修复

  • DialogNavigator 现在在执行 dismiss() 调用时使用 popWithTransition。这修复了在 dialog 目标中使用 ViewModel 时发生的竞争条件,该条件会导致在通过使用系统后退或点击对话框外部退出来关闭对话框时出现 IllegalStateException。 (Id7376, b/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 更改

错误修复

  • NavHost 现在依赖于 NavController 中的 visibleEntries 来确定要组合哪些条目。这意味着在使用嵌套 NavHost 时,内部 NavHost 现在应该能够正确地进行动画淡出。 (I4ba2b, b/225394514)
  • NavController 提供的 visibleEntries StateFlow 现在基于条目的最大生命周期状态,而不是当前的生命周期状态。这意味着即使 navController 的主机生命周期降至 STARTED 以下,可见条目列表也将保持不变。 (I9e2a8, b/225394514)
  • SavedStateViewFactory 现在支持即使在使用 SavedStateRegistryOwner 初始化时,也使用 CreationExtras。如果提供了额外信息,则初始化参数将被忽略。 (I6c43b, b/224844583)
  • NavDeepLink 现在可以解析只有一个没有值的查询参数的 URI。 (I0efe8, b/148905489)
  • 空字符串现在被视为深层链接中有效的参数。 (I70a0d, b/217399862)
  • Navigation Safe Args 在使用命名空间且没有 AndroidManifest.xml 时将不再崩溃。 (I17ccf, b/227229815)

版本 2.5.0-alpha03

2022 年 2 月 23 日

androidx.navigation:navigation-*:2.5.0-alpha03 已发布。 版本 2.5.0-alpha03 包含这些提交。

API 更改

  • 现在可以将 CreationExtras 传递给 by navGraphViewModels,以创建一个 ViewModel。 (I29217, b/217618359)

错误修复

  • NavDeepLinks 现在正确地支持嵌入在路由/深层链接 URI 中的编码换行符。 (I513d1, b/217815060)
  • CreationExtras 现在在与 NavBackStackEntries 一起使用以创建 ViewModels 时将能够正常工作。 (I69161, b/217617710)
  • Navigation Safe Args 现在支持使用 build.gradle 中定义的命名空间来代替 AndroidManifest 中的包名。 (I659ef, b/217414933)

版本 2.5.0-alpha02

2022 年 2 月 9 日

androidx.navigation:navigation-*:2.5.0-alpha02 已发布。 版本 2.5.0-alpha02 包含这些提交。

错误修复

版本 2.5.0-alpha01

2022 年 1 月 26 日

androidx.navigation:navigation-*:2.5.0-alpha01 已发布。 版本 2.5.0-alpha01 包含这些提交。

新功能

错误修复

  • 修复了从片段的 onCreate() 访问通过 by navGraphViewModels() 创建的 ViewModel 时,会导致出现 IllegalStateException 的问题。 (I8a14d)
  • NavDeepLink 将不再不必要地对参数进行两次解码,这意味着现在将正确地将参数传递给您的最终目标。 (I31b0a, b/210711399)

安全参数

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

版本 2.4.2

版本 2.4.2

2022 年 4 月 6 日

androidx.navigation:navigation-*:2.4.2 已发布。 版本 2.4.2 包含这些提交。

错误修复

版本 2.4.1

版本 2.4.1

2022 年 2 月 9 日

androidx.navigation:navigation-*:2.4.1 已发布。 版本 2.4.1 包含这些提交。

错误修复

  • NavHostFragment 现在在使用 viewbinding 和嵌套图时将正确地设置 OnBackPressedDispatcher。 (Ifbb51, b/214577959)
  • 当通过多个嵌套的 NavGraph 进行深度链接时,后退栈现在将正确包含中间的开始目标。 (I504c0, b/214383060)
  • Navigation 2.5.0-alpha01 回退:修复了从 Fragment 的 onCreate() 访问通过 by navGraphViewModels() 创建的 ViewModel 会导致 IllegalStateException 的问题。 (I8a14d)
  • Navigation 2.5.0-alpha01 回退:NavDeepLink 不会再不必要地对参数进行两次解码,这意味着现在将正确解码的参数传递给最终的目标。 (I31b0a, b/210711399)
  • Navigation 2.5.0-alpha01 回退:Safe Args 现在依赖于 Android Gradle Plugin 版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle Plugin 7.1.0 及更高版本兼容。 (I41c88, b/213086135, b/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 子类)的类的可空性。所有以前属于 -ktx 工件的 Kotlin 扩展函数已移动到各自的主工件。 -ktx 工件将继续发布,但完全为空。
  • navigation-fragment 工件现在包含一个通过新的 AbstractListDetailFragment 预构建的 双窗格布局 的实现。此片段使用 SlidingPaneLayout 来管理列表窗格(您的子类提供)和详细窗格,该窗格使用 NavHostFragment 作为其实现,如我们的 示例实现 所示。
  • NavController 上的 currentBackStackEntryAsFlow() 方法提供了一个 Flow,它会在当前的 NavBackStackEntry 发生更改时发出。此流程可以用作手动管理 OnDestinationChangedListener 的替代方法。
  • NavController 现在提供了通过实验性的 visibleEntries 属性检索所有可见 NavBackStackEntry 实例列表作为 StateFlow 的功能。
  • 现在可以扩展 NavType 类以创建自定义 NavType。自定义类型仅在以编程方式构建导航图时受支持,例如通过 导航图 Kotlin DSL
  • Navigation 现在提供了 findStartDestination()getHierarchy() API,可用于帮助实现自定义 NavigationUI。 findStartDestination()NavGraph 上的扩展函数,它将定位当您导航到图时将显示的实际起始目标,即使 startDestination 本身是一个嵌套的 NavGraphgetHierarchy()NavDestination 上的函数,可用于验证给定目标是否位于另一个目标的层次结构中。

    val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
    
  • 采用 BottomNavigationViewNavigationUI 方法已更新,改为采用 Material 1.4.0 中引入的其超类 NavigationBarView。这允许这些方法与 NavigationRailView 一起使用。

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

  • Safe Args 现在为每个 NavArgs 类生成一个 fromSavedStateHandle() 方法。 (#122, b/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 属性已弃用,取而代之的是 popUpToId
  • getStartDestination() API 已弃用,取而代之的是 getStartDestinationId()

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

Navigation Compose

navigation-compose 工件提供了 Navigation 组件Jetpack Compose 之间的集成。它使用 @Composable 函数作为应用程序中的目标。

此版本提供

  • 一个 NavHost 可组合项,允许您通过 Kotlin DSL 构建导航图,使用 composabledialog 目标,以及对可选导航器的支持,例如来自 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 导航指南

多个后退栈

NavController 负责管理目标的后退栈,当您 navigate() 到目标时将目标添加到后退栈,并在您调用 popBackStack() 或触发系统后退按钮时将其删除。现有的 NavOptions 类以及与导航图 XML 中的 <action> 元素的集成已扩展以支持保存和恢复后退栈。

作为此更改的一部分,NavigationUIonNavDestinationSelected()BottomNavigationView.setupWithNavController()NavigationView.setupWithNavController() 方法现在会自动保存和恢复已弹出目标的状态,从而在无需任何代码更改的情况下支持多个后退栈。在将 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 构建器 上添加 restoreState 布尔属性和 saveState 布尔属性。

    // 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()setPopUpTo() 的新重载,该重载接受一个额外的 saveState 参数。

    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 时按预期工作。
  • 导航现在依赖于 Lifecycle 2.3.1,并将 setGraph()popBackStack()navigateUp()navigate()(更新 NavBackStackEntry Lifecycle 的方法)标记为 @MainThread,使导航与 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 解析的参数现在将井号视为与问号相同的方式作为参数之间的分隔符。(I21309, b/180042703)

错误修复

  • 深层链接将不再忽略其值与占位符名称相同的参数。(If8017, b/207389470)
  • NavControllerNavController 恢复后使用过渡弹出嵌套目标时将不再崩溃。(I0f7c9, b/205021623)
  • 使用无效的 startDestination 时,错误消息现在将默认设置为起始目标的路由(如果有)。(I86b9d, b/208041894)

导航 Compose 错误修复

  • 修复了使用底部导航菜单项在起始目标和其他目标之间快速切换时造成的潜在崩溃。(Ic8976, b/208887901)
  • 对话框目标现在在配置更改或进程死亡后会正确地恢复到屏幕顶部。(I4c0dc, b/207386169)
  • 修复了尝试从对话框的 NavBackStackEntry 中检索 ViewModel 时,在对话框被关闭时会失败的问题。(I6b96d, b/206465487)
  • 修复了在使用 Navigation Compose 的 NavHostactivity 目标时会导致无限重组的问题。(I8f64c)
  • 修复了 Navigation Compose 中的内存泄漏问题,该问题在配置更改或进程死亡后会保留对旧活动的引用。(I4efcb, b/204905432)

Safe Args 错误修复

  • SafeArgs 在尝试在进程死亡后恢复自定义可解析数组时不再崩溃。(I618e8, b/207315994)
  • 修复了 safe args 中的一个错误,该错误不允许布尔型数组具有 null 值。(I8c396, b/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 中延迟编译,而不是在膨胀期间编译。这将改善包含深层链接的导航图的膨胀时间。(b8d257, b/184149935)

错误修复

  • 修复了在将 NavHost 直接添加到活动的 setContent() 中时,NavBackStackEntries 在移动到 Lifecycle.State.STARTED 后会被推送到 Lifecycle.State.CREATED 的问题。(Ia5ac1, b/203536683)
  • 修复了在对话框实际显示之前从回退栈中弹出 DialogFragment 目标时,实际上不会关闭对话框,从而导致用户手动关闭错误对话框时出现崩溃的竞争条件。(I687e5)
  • 修复了 NavigationUI 上的 onNavDestinationSelected API 即使您实际上没有 navigate() 到该导航图也会返回 true 的问题。它现在使用 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 配合使用。(I901e3, b/201446416)

API 更改

  • visibleEntries API 现在已处于实验阶段。(I93f6f)

错误修复

  • 在通过在同一屏幕之间来回导航中断过渡时,ViewModel 将不再被销毁 (Id52d8, b/200817333)
  • 可为空的 NavDeepLink 参数在将深层链接添加到 NavDestination 时不再需要默认值。(I5aad4, b/201320030)
  • 具有不同生命周期的 NavBackStackEntries 不再被视为相等。这意味着在使用 singleTop 进行导航以及重新选择底部菜单项时,NavHost 将正确地重新组合所有目标。(I1b351, b/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)

错误修复

  • 动态导航在活动被重新创建时将不再崩溃。(Ifa6a3, b/197942869)
  • 修复了仅在弹出到包含 NavHost 的可组合目标后才会发生的系统后退按钮问题。(3ed148, b/195668143)
  • SafeArgs 现在以正确的参数顺序生成 fromBundle()fromSavedStateHandle() 的参数。(I824a8, b/200059831)

版本 2.4.0-alpha09

2021 年 9 月 15 日

androidx.navigation:navigation-*:2.4.0-alpha09 已发布。 版本 2.4.0-alpha09 包含以下提交。

新功能

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

API 更改

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

行为更改

  • 生成参数时,Safe Args 现在将没有默认值的参数放在有默认值的参数之前。(I89709, b/198493585)

错误修复

  • 使用 Navigation Compose 时,NavGraphs 只有在所有子节点都 DESTROYED 后才会 DESTROYED。(I86552, b/198741720)
  • 可为空的 NavDeepLink 参数不再需要默认值。(Ia14ef, b/198689811)
  • 使用新图调用 setGraph() 现在除了之前的弹出回退栈行为外,还会清除任何保存的回退栈。(I97f96)
  • 修复了在使用 launchSingleTopOnDestinationChangedListener 实例和 currentBackStackEntryFlow 未收到通知的问题。(Iaaebc)

依赖更新

版本 2.4.0-alpha08

2021 年 9 月 1 日

androidx.navigation:navigation-*:2.4.0-alpha08 已发布。 版本 2.4.0-alpha08 包含以下提交。

新功能

行为更改

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

错误修复

  • 在可组合函数中使用 getBackStackEntrypreviousBackStackEntry,与 remember() 结合使用,将不再对回退栈中没有目标产生异常。(I75138, b/194313238)
  • Navigation Compose 现在在更改回退栈参数并使用 launchSingleTop=true 时会正确地重新组合。(Iebd69, b/186392337)
  • 在使用具有 13 个或 29 个目标的图调用 setGraph 时,将不再出现 ArrayIndexOutOfBoundsException。(I1a9f1, b/195171984)
  • SafeArgs Java 生成器在生成 Args 类时应该不再导致 Lint 警告。(I1a666, b/185843837)

外部贡献

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

版本 2.4.0-alpha07

2021 年 8 月 18 日

androidx.navigation:navigation-*:2.4.0-alpha07 已发布。 版本 2.4.0-alpha07 包含以下提交。

错误修复

  • Navigation Compose 现在在配置更改后以及在使用多个回退栈时更改图后会正确地保存状态。(If5a3d, b/195141957)
  • 在使用多个回退栈的导航组合中重新选择同一选项卡将不再导致空白屏幕。(I860dc, b/194925622)
  • NavHost 现在观察 NavBackStackEntryLifecycle.State 的变化,这意味着在片段中使用 NavHost 现在将根据生命周期变化正确地重新组合,而不是导致空白屏幕。(I4eb85, b/195864489)
  • 修复了关闭 DialogFragment 不会在重新创建活动后(即,配置更改后)正确更新 NavController 状态的问题。(Icd72b)
  • 修复了弹出对话框目标不会更新 NavController 的系统后退按钮处理的问题,这可能会导致 NavController 拦截后退按钮,即使它没有任何回退栈要弹出。(If3b34)
  • Safe-args 现在会自动为参数生成 toSavedStateHandle 方法,该方法可用于测试您的 ViewModel 代码。(If1e2d, b/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 状态。(If0543, b/172112072, b/194301889)
  • Navigation Compose 的 NavHost 现在将图设置为第一次组合的一部分。(Ieb7be)

错误修复

  • 弹出导航图的最后一个目标不再抛出 ClassCastException。(If0543, b/172112072, b/194301889)
  • 修复了在添加没有 Uri 的深层链接并通过路由或深层链接导航时发生的 NullPointerException。(938a0c, b/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 现在在导航到目标时始终使用 Crossfades。(I07049, b/172112072)
  • 您现在可以更改 NavHost 的图。具有相同 startDestination 和图中目标的图将被视为相等,并且不会清除 NavController 回退栈。(I0b8db, b/175392262)

错误修复

  • 修复了在从附加到 NavBackStackEntryLifecycleObserver 中调用 popBackStack() 时发生的 NoSuchElementException,该异常是由对 NavController 状态的重入更新引起的。(I64621)
  • AbstractListDetailFragment 现在允许在不使用 AbstractListDetailFragment 时从 APK 中完全删除 SlidingPaneLayout。(I611ad)
  • NavGraphNavDestination 现在覆盖了 equals 方法,因此具有相同值的两个对象将被视为相等。(I166eb, b/175392262)

版本 2.4.0-alpha04

2021 年 7 月 1 日

androidx.navigation:navigation-*:2.4.0-alpha04 已发布。 版本 2.4.0-alpha04 包含以下提交。

新功能

  • navigation-fragment 工件现在包含 双窗格布局 的预构建实现,通过新的 AbstractListDetailFragment。该片段使用 SlidingPaneLayout 来管理列表窗格(由您的子类提供)和详细信息窗格,该窗格使用 NavHostFragment 作为其实现,如我们的 示例实现 所示。(Iac4be, b/191276636)
  • navigation-compose 工件的 NavHost 现在除了 composable 目标外,还支持 dialog 目标。这些对话框目标将分别在 Composable 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()。 (Ie89fc, b/172112072)
  • 自定义 Navigator 实例现在可以使用 NavigatorState 上的 pushWithTransactionpopWithTransition API 来异步推送或弹出目的地。请注意,这些 API 尚未被任何包含的导航器使用。 (Ic4d7c, b/172112072)

行为更改

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

错误修复

  • 修复了 <include-dynamic> 的问题,其中传递给图表的参数不会正确传递给动态包含的图表。 (I3e115)
  • 修复了使用 string[] 参数并具有 @null 默认值的目的地导航时发生的 NullPointerException。 (I1fbe8)
  • 添加了 @Navigator.Name 的 ProGuard 规则,修复了使用 R8 3.1 全模式时的错误。 (I2add9, b/191654433)
  • SafeArgs 在使用 Kotlin 版本早于 1.5.0 的情况下,构建您的应用程序时将不再失败。 (Icd1ff, b/190739257)

版本 2.4.0-alpha03

2021 年 6 月 16 日

androidx.navigation:navigation-*:2.4.0-alpha03 已发布。 版本 2.4.0-alpha03 包含这些提交。

错误修复

  • 修复了需要两次 navigate() 调用才能导航到包含的动态图表的问题。 (I7785c, b/188859835)
  • 修复了 Navigation 2.4.0-alpha01 中引入的回归,其中 setupActionBarWithNavController() 在您位于顶级目的地时不会正确删除向上图标。 (I5d443, b/189868637)
  • 修复了在先前弹出 NavController 的根图表后调用 popBackStack() 时的 IllegalStateException。 (I2a330, b/190265699)
  • by navArgs() 的 ProGuard 规则现在在使用 navigation-common 或任何依赖它的工件时都适用。 (I68800, b/190082521)
  • 首次收到回调时调用 navigate()OnDestinationChangedListener 现在将正确地获得第二个回调,并使用它导航到的目的地。 (Ie5f9e, b/190228815)
  • Safe Args 在与动态功能模块和 AGP 7.0+ 一起使用时,不再崩溃。 (I69518, b/189966576)

已知问题

  • Safe Args 在使用 Gradle 6.7.0 时,由于依赖于旧版本的 Kotlin,将以 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。 (Ib5544, Ia617b, I22f96, b/188914648, b/188901565)
  • NavigationUI 暂时添加了实验性 API 来允许选择退出保存您的状态。虽然始终保存状态是正确的行为,但仍然存在一些使用已弃用库(即保留的 fragment)的情况,在保存状态时无法得到支持,因此这为应用程序提供了逐步从任何不受支持的 API 转换过来的机会。 (Idf93c)
  • Navigation 现在提供了 findDestination()getHierarchy() API,可以用来帮助实现自定义 NavigationUI。 findDestination()NavGraph 上的扩展函数,将在图表中定位目的地。 getHierarchy()NavDestination 上的函数,可用于验证给定目的地是否在另一个目的地的层次结构内。(I2932f, b/188183365)

    val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
    
  • 接受 BottomNavigationView 的 NavigationUI 方法已更新为改用其在 Material 1.4.0 中引入的超类 NavigationBarView。这允许这些方法与 NavigationRailView 一起使用。 (Ib0b36, b/182938895)

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

API 更改

错误修复

  • DialogFragmentNavigator 现在使用 NavigatorState.pop() API 来通知 NavController,当对话框通过按下系统后退按钮或点击其外部而被关闭时,确保 NavController 状态始终与 Navigator 的状态同步。 (I2ead9)
  • Navigation 在使用 onDestinationChanged 回调中操作 OnDestinationChangedListeners 列表时,不再出现 ConcurrentModificationException。 (Ib1707, b/188860458)

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

  • NavDestination 上的 setId 方法现在使用 @IdRes 正确地进行注释,因此它只接受资源 ID。 (I69b80)

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

依赖项更新

  • Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。这意味着您现在应该不再收到使用 applicationIdTextResource 的警告。 (I6d67b, b/172824579)

版本 2.4.0-alpha01

2021 年 5 月 18 日

androidx.navigation:navigation-*:2.4.0-alpha01 已发布。 版本 2.4.0-alpha01 包含这些提交。

新功能

  • NavController 上的 currentBackStackEntryAsFlow() 方法提供了一个 Flow,它在当前 NavBackStackEntry 发生更改时发出。此 flow 可用作手动管理 OnDestinationChangedListener 的替代方案。 (I19c4a, #89, b/163947280)

多个后退栈

NavController 负责管理目的地的后退堆栈,当您 navigate() 到它们时将目的地添加到后退堆栈,当您调用 popBackStack() 或触发系统后退按钮时将其移除。现有的 NavOptions 类以及与导航图 XML 中的 <action> 条目的集成已被扩展为支持保存和还原后退堆栈。 (b/80029773)

作为此更改的一部分,NavigationUIonNavDestinationSelected()BottomNavigationView.setupWithNavController()NavigationView.setupWithNavController() 方法现在会自动保存和还原弹出目的地的状态,从而支持多个后退堆栈,而无需任何代码更改。在使用 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 构建器 上添加 restoreState 布尔属性和 saveState 布尔属性。

    // 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()setPopUpTo() 的新重载,该重载接受一个额外的 saveState 参数。

    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 以及用于 Navigation with Fragments 中 <fragment> 目的地的 FragmentNavigatorDynamicFragmentNavigator 都已更新为使用新的 Navigator API 并支持保存和还原状态。

Navigation 路由

路由 是一个 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 子类)的类的可空性。 所有以前属于 -ktx 工件的 Kotlin 扩展函数都已移至其各自的主工件。 -ktx 工件将继续发布,但完全为空。 (b/184292145)
  • NavDeepLinkBuilder 现在支持将多个不同的目的地添加到生成的回退栈中。 (I3ee0db/147913689)
  • 添加了 DynamicNavHostFragment 的工厂函数 (Icd515b/175222619)
  • 现在将 NavBackStackEntry 的唯一 ID 公开为其公共 API 的一部分。 (Ie033a)
  • 现在,NamedNavArgumentnameargument 字段和解构函数是公开的。 (#174b/181320559)
  • 引入了一个新的 NavBackStackEntry#provideToCompositionLocals 扩展,该扩展将 NavBackStackEntry 提供给相关的组合局部变量。 (#175b/187229439)

安全参数

  • Safe Args 现在为每个 NavArgs 类生成一个 fromSavedStateHandle() 方法。 (#122, b/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 Lifecycle 的方法(如 setGraph()popBackStack()navigateUp()navigate())标记为 @MainThread,使 Navigation 与 Lifecycle 2.3.0 中引入的主线程强制执行相一致。 (b/171125856)
  • 现在解析来自深度链接的枚举参数时不区分大小写,允许像 http://www.example.com/red 这样的深度链接匹配 www.example.com/{color} 深度链接,即使枚举的值为 RED。 (#152b/135857840)

Compose 兼容性

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

错误修复

  • 修复了一个问题,即尾随参数占位符会优先于具有匹配完全后缀的深度链接。 (#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 使 NamedNavArgumentnameargument 字段和解构函数成为公开的。 (#174b/181320559)
  • 感谢 jossiwolf 引入了一个新的 NavBackStackEntry#provideToCompositionLocals 扩展,该扩展将 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,该 Modifier 会传递给包装目的地可组合的的可组合容器。 (I85acab/175125483)

错误修复

  • NavHost 现在即使在找不到 OnBackPressedDispatcherOwner 的情况下也能正常工作,例如在预览 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 现在返回一个可空的 ViewModelStoreOwner,以便更好地确定当前组合中是否存在 ViewModelStoreOwner。 需要 ViewModelStoreOwner 的 API(如 viewModel()NavHost)在未设置 ViewModelStoreOwner 时仍然会抛出异常。 (Idf39a)

错误修复

  • 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 包含这些提交。

错误修复

  • 修复了在配置更改或进程死亡和重新创建后,popBackStack()navigateUp() 不起作用的问题。 (Icea47, b/173281473)
  • 现在可以在 NavHost 中正确地导航到嵌套的图。 (I0948d, b/173647694)

版本 1.0.0-alpha02

2020 年 11 月 11 日

androidx.navigation:navigation-compose:1.0.0-alpha02 已发布。 版本 1.0.0-alpha02 包含这些提交。

API 更改

  • 导航 Compose 现在支持 NavOptions,用于执行 popUpTo 和 launchSingleTop 操作。 (If96c3, b/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 组件Jetpack Compose 之间的集成。它使用 @Composable 函数作为应用程序中的目标。

此初始版本提供以下内容:

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

有关更多信息,请参阅 Compose 导航指南

版本 2.3.5

版本 2.3.5

2021 年 4 月 7 日

androidx.navigation:navigation-*:2.3.5 已发布。 版本 2.3.5 包含这些提交。

新功能

  • 使用 NavDeepLinkRequestUri 导航时,您现在可以通过 KEY_DEEP_LINK_INTENT 从参数中获取意图,在结果目的地中访问 Uri、操作和 MIME 类型,这与外部深层链接中已有的功能相呼应。 (I975c3, b/181521877)

错误修复

  • 在 Activity 生命周期处于 STOPPED 状态,然后处于 STARTED 状态时,使用 NavBackStackEntry 作为 LifecycleOwner 添加到调度程序的 OnBackPressedCallbacks 现在可以正确地拦截返回。 (Iff94f, b/182284739)
  • 深层链接域解析现在不区分大小写,确保 www.example.comwww.example.comwww.Example.com 都匹配。请注意,查询参数名称仍然区分大小写。 (#144, b/153829033)
  • 修复了当目的地具有多个非空默认参数并且您导航到该目的地时仅覆盖这些参数的子集时可能出现的 NullPointerException。 (aosp/1644827)

依赖更新

外部贡献

版本 2.3.4

版本 2.3.4

2021 年 3 月 10 日

androidx.navigation:navigation-*:2.3.4 已发布。 版本 2.3.4 包含这些提交。

新功能

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

错误修复

  • 修复了在使用 Navigation 对动态功能的支持时卡住安装进度的错误。 (Ib27a7, b/169636207)
  • 现在使用已设置的相同对象调用 setViewModelStoresetLifecycleOwner 将是无操作的。 (Idf491, b/177825470)
  • Safe-Args 现在在使用 Java 时在正确的方法上添加抑制注释。 (I8fbc5, b/179463137)

外部贡献

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

版本 2.3.3

版本 2.3.3

2021 年 1 月 27 日

androidx.navigation:navigation-*:2.3.3 已发布。 版本 2.3.3 包含这些提交。

错误修复

  • 在将 NavBackStackEntryLifecycle 移动到 CREATED 之前弹出它时不再会崩溃。 (Ie3ba3)
  • 修复了由 b/171364502 引起的回归,其中导航到具有 0 的动画资源值的活动会导致 ResourceNotFoundException。 (I7aedb, b/176819931)

版本 2.3.2

版本 2.3.2

2020 年 12 月 2 日

androidx.navigation:navigation-*:2.3.2 已发布。 版本 2.3.2 包含这些提交。

错误修复

  • 修复了 NavigationUI 中的回归,其中使用具有 onNavDestinationSelected<activity> 目的地将无法导航到活动。 (I22e34, b/171364502)
  • 修复了 navigation-dynamic-features-fragment 会导致多次导航到新安装的目的地的问题。 (aosp/1486056, b/169636207)
  • 修复了在使用 launchSingleTop 时,默认参数不会发送到 OnDestinationChangedListener 实例的问题。 (I2c5cb)
  • 修复了导航到嵌套导航图不会在后退栈中创建新图实例的问题。 (Ifc831)
  • 修复了使用 navigate()popUpTo(它删除了导航图中的最后一个目的地)不会立即销毁并从后退栈中删除导航图本身的问题。 (I910a3)
  • Navigation Safe Args 现在使用 KotlinPoet 版本 1.7.2,该版本增加了对 Kotlin 的显式 API 模式的支持。 (I918b5)
  • NavHostFragment.findNavController(Fragment) 现在除了对 Fragment 层次结构和 Fragment 的视图层次结构的现有检查外,还检查对话框片段的根装饰视图。这使您可以使用 FragmentScenarioNavigation.setViewNavController() 测试使用 Navigation 的对话框片段。 (I69e0d)

版本 2.3.1

版本 2.3.1

2020 年 10 月 14 日

androidx.navigation:navigation-*:2.3.1 已发布。 版本 2.3.1 包含这些提交。

新功能

  • 默认动画程序资源已添加到 Navigation UI,建议使用它们而不是默认动画资源。 (b/167430145)
  • NavOptions 现在覆盖了哈希码和 equals 方法。 (b/161586466)
  • Navigation 现在在“没有 ID 为”的 IllegalArgumentException 中包含当前目的地,这应该可以改善开发人员的调试体验。 (b/168311416)

错误修复

  • Safe Args 将不再换行,即使生成的 arguments 类名称超过 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,它允许您设置当前目标并验证导航操作后的回退栈。有关更多信息,请参阅 测试导航
  • 返回结果: 现在,与导航回退栈上的每个目标关联的 NavBackStackEntry 允许您访问一个 SavedStateHandle,该 SavedStateHandle 适合存储应与特定回退栈条目关联的小量保存状态。有关更多信息,请参阅 将结果返回到前一个目标
  • NavigationUIOpenable 的支持: NavigationUI 中所有对 DrawerLayout 的使用都已替换为更通用的 Openable 接口,该接口在 CustomView 1.1.0 中添加,并由 DrawerLayoutDrawerLayout 1.1.0 中实现。
  • 深层链接中的操作和 MIME 类型支持: 深层链接已扩展为除了以前可用的 app:uri 之外,还支持 app:actionapp:mimeTypeNavController 现在通过新的 NavDeepLinkRequest 类支持通过这些字段的任何组合进行导航。有关更多信息,请参阅 使用 NavDeepLinkRequest 导航

已知问题

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

版本 2.3.0-rc01

2020 年 6 月 10 日

androidx.navigation:navigation-*:2.3.0-rc01 已发布。 版本 2.3.0-rc01 包含这些提交。

错误修复

  • 修复了在将没有参数的目标实例替换为具有参数的另一个实例(具有 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 包含这些提交。

错误修复

  • 修复了 NavBackStackEntryLifecycle 在进程死亡后不会正确更新的问题。(b/155218371)
  • 现在,在调用 setGraph() 之前注册的 OnDestinationChangedListener 实例将在进程死亡后正确地收到已恢复的目标。(b/155218371)
  • 使用 singleTop 时,NavBackStackEntry 现在会正确更新其参数,并且更新后的参数会发送到所有 OnDestinationChangedListener 实例。(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 更改

  • 大大扩展了 Kotlin DSL 对动态导航目标的支持。(b/148969800)

错误修复

  • 修复了使用嵌套启动目标时忽略深层链接 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)
  • 导航图 Kotlin DSL 现在公开了用于操作的 defaultArguments Map,镜像了在导航 XML 文件中为 <action> 元素设置默认值的能力。(b/150345605)

错误修复

  • Navigation 2.2.2 开始:修复了在活动中有多个 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 中添加了对功能模块活动和片段目标的支持。(b/148969800)

API 更改

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

错误修复

  • NavigationUI 不再忽略空标签(例如,具有 android:label=”” 的目标),并且现在会正确地将标题设置为空字符串。(b/148679860)

依赖更新

  • Navigation 动态功能工件现在依赖于 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 更改

错误修复

  • 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,该 SavedStateHandle 适合存储应与特定回退栈条目关联的小量保存状态。有关示例用例,请参阅 返回结果。(b/79672220)

API 更改

  • 已添加 getCurrentBackStackEntry()getPreviousBackStackEntry() 的便捷方法,以便更轻松地检索当前目标和前一个目标的 NavBackStackEntry。(b/79672220)

错误修复

  • 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 类。当 测试导航 时,该类提供了对使用模拟 NavController 的替代方法,它允许您设置当前目标并验证导航操作后的回退栈。(b/140884273)
  • 新的 navigation-dynamic-features-fragment(及其传递依赖项 navigation-dynamic-features-runtime)允许您从 功能模块 中包含目标或整个导航图(通过 <include-dynamic>),在导航到这些目标时提供对按需功能模块的无缝安装。有关更多信息,请参见 使用功能模块导航。(b/132170186

错误修复

  • Navigation 2.2.1 开始:没有查询参数的深层链接现在会正确地忽略任何查询参数,而不是将它们追加到尾部的 {argument} 元素或不匹配深层链接。(b/147447512
  • Navigation 2.2.1 开始:navigation-ui 的 ProGuard 规则已更新,以确保 DrawerArrowDrawable 不再需要 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 包含这些提交

错误修复

  • 修复了当在您的 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 包含这些提交

错误修复

  • 没有查询参数的深层链接现在会正确地忽略任何查询参数,而不是将它们追加到尾部的 {argument} 元素或不匹配深层链接。(b/147447512
  • navigation-ui 的 ProGuard 规则已更新,以确保 DrawerArrowDrawable 不再需要 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 集成SavedStateViewModelFactory 现在是使用 by navGraphViewModels() 或使用 NavController.getBackStackEntry()NavController.getViewModelStoreOwner() 返回的 ViewModelStoreOwnerViewModelProvider 构造函数时使用的默认工厂。
  • 对深层链接的查询参数支持:具有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可为空的参数在匹配深层链接时现在是可选的。
  • 改进的动画支持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 包含这些提交

错误修复

版本 2.2.0-rc03

2019 年 12 月 4 日

androidx.navigation:navigation-*:2.2.0-rc03 已发布。 版本 2.2.0-rc03 包含这些提交

错误修复

  • 修复了使用查询参数和作为路径最后部分的参数时,深层链接解析出现的问题,该问题阻止解析最终路径参数中的多个字符。(b/144554689
  • 修复了深层链接解析中出现的问题,其中可选参数将接收 "@null" 而不是 null。(b/141613546
  • NavHostFragment 现在可以在使用 FragmentContainerView 时,在配置更改后正确地恢复图。(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

错误修复

  • 修复了深层链接路径中的参数在也指定了查询参数时会被忽略的问题。(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

错误修复

  • 修复了使用附加到多个不同导航图作用域的 ViewModelStore 实例的 ViewModel 实例时出现的 ConcurrentModificationException。(aosp/1112257

版本 2.2.0-alpha02

2019 年 9 月 5 日

androidx.navigation:navigation-*:2.2.0-alpha02 已发布。此版本中包含的提交可以找到 这里

新功能

  • 具有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可为空的参数在匹配深层链接时现在是可选的。(b/133273839
  • 您现在可以调用 NavController.getBackStackEntry(),传入后退栈中目标或导航图的 ID。返回的 NavBackStackEntry 提供了 Navigation 驱动的 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 范围限定到导航图:现在,您可以使用 by navGraphViewModels() 属性委托 (针对使用 -ktx 库的 Kotlin 用户) 或使用添加到 NavControllergetViewModelStoreOwner() API 创建在导航图级别限定范围的 ViewModel。有关更多信息,请参阅 在目标之间共享与 UI 相关的数椐
  • 对话框目标:现在,您可以创建 <dialog> 目标,这些目标将在您 navigate 到它们时显示 DialogFragmentNavHostFragment 默认情况下支持对话框目标。有关更多信息,请参阅 从 DialogFragment 创建目标
  • 通过 URI 导航:现在,您可以使用 Uri navigate,该 URI 将使用您添加到目标的 <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 已发布。此版本包含的提交可以找到 此处

新功能

  • NavigationUI 现在会在使用 setupWithNavController()ToolbarCollapsingToolbarLayout 时为向上按钮的移除设置动画。(b/131403621)

错误修复

  • 修复了在使用多个具有相同容器的 NavHostFragment 与 findNavController() 时发生的计时问题。(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> 目标时将自身状态与屏幕上看到的内容保持同步。因此,Navigation 现在会在您导航到非对话框和非活动目标(例如 <fragment> 目标)时自动弹出 <dialog> 目标。(b/134089818)

错误修复

  • Navigation 现在会在处理深层链接时抑制在重新创建活动时发生的动画,从而修复了视觉闪烁问题。(b/130362979)
  • 修复了 Navigation 后退堆栈在弹出 Fragment 作为初始 Fragment 正在添加时不同步的错误。(b/133832218)

版本 2.1.0-alpha05

2019 年 6 月 5 日

androidx.navigation:*:2.1.0-alpha05 已发布。此版本包含的提交可以找到 此处

API 变更

  • NavController 上与主机相关的 API 已重命名并移至 NavController 的新子类 NavHostController 中。(aosp/966091)
  • NavControllersetHostOnBackPressedDispatcherOwner() 方法已替换为 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 到它们时显示 DialogFragmentNavHostFragment 默认情况下支持对话框目标。 b/80267254
  • 除了使用资源 ID 或 NavDirections 实例调用 navigate 之外,现在还可以通过 Uri 进行导航,该 URI 将使用您添加到目标的 <deepLink> 导航到正确的位置。 b/110412864

行为变更

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

API 变更

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

错误修复

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

版本 2.1.0-alpha02

2019 年 4 月 3 日

androidx.navigation:*:2.1.0-alpha02 已发布。此版本包含的提交可以找到 此处

新功能

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

API 变更

  • 现在,您可以向 <activity> 目标添加一个 app:targetPackage 来限制匹配的包名。它支持 app:targetPackage="${applicationId}" 来将包限制为您的应用程序 ID。 b/110975456

错误修复

  • 用于 <activity> 目标的 android:name 现在不再在膨胀时解析为类,从而在使用动态功能时防止 ClassNotFoundExceptions。 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 和 Bundle 创建点击监听器的替代方法。 b/127631752
  • FragmentNavigator.instantiateFragment 现在已弃用。默认实现现在使用 FragmentFactory 来实例化 Fragment。 b/119054429

错误修复

  • Navigation 在目标附加了参数时不再发送空 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 稳定版将是使用 Support Library 依赖项的最后一个版本;1.0 之后的任何未来开发都将基于 AndroidX 并建立在 2.0 稳定版的基础上。

预 AndroidX 依赖项

对于 Navigation 的预 AndroidX 版本,请包含这些依赖项

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 文件中添加以下 classpath

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
  • navigateUp() 现在在处理没有 FLAG_ACTIVITY_NEW_TASK 的深层链接后调用时,会正确地处理导航回您的应用程序的任务。 b/126082008
  • 修复了 ActivityNavigator.applyPopAnimationsToPendingTransition 未应用正确的弹出退出动画的问题。 b/126237567
  • Safe Args 生成的 Kotlin 代码现在会正确地转义 Kotlin 关键字(如 infun),这些关键字位于与 R 类关联的包名中。 b/126020455

版本 1.0.0-rc01

2019 年 2 月 21 日

这是 Navigation 1.0.0 稳定版发布的候选版本。此版本包含一个错误修复。

错误修复

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

版本 1.0.0-beta02

2019 年 2 月 12 日

此版本包含一些次要改进和重要的错误修复。

新功能

  • 现在可以使用 0 作为 android:defaultValue 用于 reference 参数。 b/124248602

行为变更

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

错误修复

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

版本 1.0.0-beta01

2019 年 2 月 4 日

这是 Navigation 的第一个 beta 版本;展望未来,Navigation API 预计在下一个版本之前会保持稳定,除非出现严重问题。此版本包含一些错误修复和行为更改。

行为变更

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

错误修复

  • Safe Args 现在可以在所有版本的 Android Gradle 插件上用于库和功能模块。 b/121304903
  • 修复了会导致单个 popBackStack() 操作弹出回退堆栈顶部所有目标副本而不是一次只弹出单个目标的回归问题。 b/123552990
  • 修复了 FragmentNavigator 状态会与 NavController 的状态不同步,从而在尝试恢复回退堆栈时导致 IllegalStateException 的问题。 b/123803044
  • 修复了在使用 ProGuard 进行混淆时,NavigationUI 处理的返回箭头不会出现的问题。 b/123449431
  • Safe Args 生成的代码现在会正确地处理使用指向以 .OuterClass$InnerClass 格式的静态内部类的 app:argTypeb/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 插件获得的构建器模式。 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 现在会通过使用您传入的参数来确定唯一性,从而正确地处理同时针对同一目标的多个 PendingIntentb/120042732
  • NavController 现在在使用嵌套的 NavHostFragment 或具有回退堆栈的其他子 Fragment 时,会正确地处理 popBackStack() 操作。 b/122770335
  • NavigationUI 现在会正确地设置上箭头的内容描述。 b/120395362
  • Safe Args 生成的 Directions 类现在可以正确处理与目标上的操作具有相同 ID 的全局操作。 b/122962504
  • Safe Args 生成的 NavDirections 类现在在 equals() 返回 true 时具有相等的 hashCode() 值。 b/123043662
  • FragmentNavigator 现在会在您尝试在 NavHostFragmentFragmentManager 上进行自定义 FragmentTransactions 时抛出一个更好的错误消息。您应该始终使用 getChildFragmentManager()b/112927148

版本 1.0.0-alpha09

2018 年 12 月 18 日

此版本包含破坏性 API 更改;请参阅下面的“破坏性更改”部分。

我们选择不再继续开发 android.arch.navigation:navigation-testing 工件。虽然它已被证明有助于对 NavController 进行内部测试,但我们强烈建议使用其他测试策略,例如模拟 NavController 实例以验证是否正在进行正确的 navigate() 调用。这种方法在 AndroidDevSummit 2018 上的单一活动演讲 中进行了详细讨论,我们将努力提供更多关于使用 Navigation 进行测试的文档。

新功能

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

破坏性更改

  • 当使用具有 argType="reference"<argument> 时,Navigation 将不再解析引用,而是提供原始资源 ID 本身。 b/111736515
  • onNavDestinationSelected() 现在默认会弹出回到导航图的起始目的地,使其与 setup 方法一致。在您的 MenuItem 中添加 menuCategory="secondary" 以避免弹出后退栈。 aosp/852869
  • 生成的 Args 类的 fromBundle() 方法现在接受一个非空 Bundle,而不是一个可空 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 现在依赖于 Support Library 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
  • 片段创建已移至 FragmentNavigator,使将片段创建委托给 FragmentFactory 变得更加容易。 b/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

错误修复

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

安全参数

  • 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 工件中,并且将不再发布。
  • navigation-testing 工件现在依赖于 Kotlin 标准库。API 已更改为更符合 Kotlin 约定,但您仍然可以使用它进行用 Java 编写的测试。
  • 元数据清单注册的导航图不再受支持。 b/118355937
  • 操作不再可以附加到 <activity> 目的地。 aosp/785539

错误修复

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

安全参数

  • Safe Args 现在对 Android Gradle 插件 3.2.1 有一个固定依赖项。 b/113167627
  • 现在可以为内部类生成 Directions。 b/117407555
  • 修复了向 <include> 图生成 Directions 的问题。 b/116542123

版本 1.0.0-alpha06

2018 年 9 月 20 日

新功能

API 更改

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

错误修复

  • NavigationUI.setupWithNavController() 在与来自各个目的地的视图一起使用时不再泄漏视图 b/111961977
  • Navigator onSaveState() 现在只调用一次 b/112627079

安全参数

  • 导航目的地 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 插件中有关可空性的错误消息。
  • 添加了缺少的可空性注释。

版本 1.0.0-alpha04

2018 年 7 月 19 日

导航 1.0.0-alpha04 及其关联的 Safe Args gradle 插件包含一些 API 更改、行为更改和错误修复。

API/行为更改

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

安全参数

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

错误修复

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

版本 1.0.0-alpha03

2018 年 7 月 12 日

导航 1.0.0-alpha03 及其关联的 Safe Args gradle 插件包含一些 API 更改、行为更改和错误修复。

API/行为更改

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

安全参数

  • 重大更改:操作和参数名称中的非字母数字字符将在相应的 NavDirections 方法名称中被替换为驼峰式大小写。
    • 例如,DemoController.index 将变为 setDemoControllerIndex b/79995048
    • 例如,action_show_settings 将变为 actionShowSettings b/79642240
  • 重大更改:参数现在默认情况下被视为非空。要允许字符串和可打包参数为空值,请添加 app:nullable="true" b/79642307
  • 您现在可以使用 app:type="long",其默认值形式为“123L” b/79563966
  • 现在支持可打包参数,使用完全限定的类名作为 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 现在为导航 XML 文件中的每个 android:name 属性添加保留规则 b/79874119
  • 修复了替换默认 FragmentNavigator 时的内存泄漏问题 b/110900142

版本 1.0.0-alpha02

2018 年 6 月 7 日

行为更改

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

  • 导航现在对从深层链接 URL 解析的参数进行 URL 解码。 b/79982454

错误修复

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

  • 导航现在依赖于 Support Library 27.1.1,以修复在使用动画时出现的闪烁问题。 b/80160903

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

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

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

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

  • 导航现在为嵌套图构建正确的合成回退堆栈。 b/79734195

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

API 更改

  • 操作的 clearTask 属性和 NavOptions 中的关联 API 已弃用。 b/80338878

  • 操作的 launchDocument 属性和 NavOptions 中的关联 API 已弃用。 b/109806636

版本 1.0.0-alpha01

2018 年 5 月 8 日

导航 提供了一个用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01