导航

导航是一个用于在 Android 应用程序的“目标”之间进行导航的框架,它提供了统一的 API,无论目标是作为 Fragment、Activity 还是其他组件实现。
最新更新 稳定版 发布候选版 Beta 版 Alpha 版
2025 年 5 月 7 日 2.9.0 - - -

声明依赖项

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

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

Groovy

plugins {
  // Kotlin serialization plugin for type safe routes and navigation arguments
  id 'org.jetbrains.kotlin.plugin.serialization' version '2.0.21'
}
  
dependencies {
  def nav_version = "2.9.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"

  // JSON serialization library, works with the Kotlin serialization plugin.
  implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3"
}

Kotlin

plugins {
  // Kotlin serialization plugin for type safe routes and navigation arguments
  kotlin("plugin.serialization") version "2.0.21"
}

dependencies {
  val nav_version = "2.9.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")

  // JSON serialization library, works with the Kotlin serialization plugin
  implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
}

Safe Args

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

Groovy

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

Kotlin

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

版本 2.9.0

2025 年 5 月 7 日

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

自 2.8.0 以来的重要更改

  • Navigation Safe Args 动作现在通过 @CheckResult 注解生成,以确保它们被使用。

SupportingPane 接口

  • 自定义导航器现在可以将其目标标记为实现 SupportingPane 接口,这向 NavController 指示这些目标将与其他目标一起显示。例如,通过使用此接口,可以同时 RESUMED 多个目标。

Compose Kotlin Multiplatform

  • 导航现在提供了一个新的通用 NavController.handleDeepLink() 函数,该函数接受 NavDeepLinkRequest 而不是 Intent。这允许 Android 以外的平台正确处理深层链接。感谢 Konstantin Tskhovrebov!
  • 导航现在提供 NavUri,这是一个新的通用解析器函数,它是 Android URI 在其他平台上的兼容 API。这使得以平台无关的方式创建 URI 成为可能。感谢 Konstantin Tskhovrebov!

类型安全函数

  • 以前只能通过 reified 方法(即 composable<YourScreen>)访问的类型安全 API 现在具有直接接受 KClass 实例的非 reified 版本。
  • 导航类型安全现在支持值类作为路由或路由的参数类型。

版本 2.9.0-rc01

2025 年 4 月 23 日

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

错误修复

  • 移除了 Jetpack Navigation 中所有非 Android 平台目标,因为这些目标实际上不起作用。现在提供了不同平台的存根。( I2877d )

版本 2.9.0-beta01

2025 年 4 月 9 日

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

API 变更

  • 通用 API parseStringAsNavUri 已更改为接受 String 的 NavUri 工厂函数。( I4db6e , b/403616316 )

依赖项更新

  • 此库现在面向 Kotlin 2.0 语言级别,并需要 KGP 2.0.0 或更高版本。( Idb6b5 )

版本 2.9.0-alpha09

2025 年 3 月 26 日

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

新功能

  • navigation-testing 模块现在除了 Android 外,还支持桌面、Linux、macOS 和 iOS。( I2b770 , b/398265336 )
  • NavType 现在除了 Android 外,还支持桌面、Linux、macOS 和 iOS。( I297d8 )

版本 2.9.0-alpha08

2025 年 3 月 12 日

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

错误修复

  • 导航 2.8.9起:修复了在导航 2.8.8 中发现的一个回归问题,该问题要求深层链接必须与深层链接请求或 intent 的所有字段精确匹配才能被视为匹配。这导致包含部分字段匹配而没有其他字段的深层链接不再起作用。( Ie5e36 , b/399826566 )

外部贡献

  • 创建 NavUri 的新通用解析器函数。感谢 Konstantin Tskhovrebov!( If0a6a )

版本 2.9.0-alpha07

2025 年 2 月 26 日

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

错误修复

  • 修复了尝试使用非包含式 pop saveState 时导致空保存状态可能导致恢复崩溃的问题。( I9f3e8 , b/395091644 )
  • 导航 2.8.8起:NavDeepLink 匹配已修复,其中深层链接和深层链接请求必须在 URI、操作和 MIME 上精确匹配。如果仅一个或两个字段匹配,则不再允许匹配。( I3b029 , b/395712033 )
  • 导航 2.8.8起:修复了带有通配符路径的路由与添加的深层链接不匹配的 bug。( I7ea92 , b/389970341 )

外部贡献

  • 将 navigation-common、navigation-runtime 和 navigation-compose API 提取到通用平台。感谢 Konstantin Tskhovrebov!( I1e626 , Ica76f , Idf479 )

已知问题

  • 由于处理 b/395712033 的工作,深层链接被错误地要求具有与深层链接请求和/或 Intent 相同的所有字段。深层链接应该只要求匹配它们所拥有的字段,而不包含的字段应该被忽略。这已在后续版本中作为 b/399826566 的一部分进行修复。

版本 2.9.0-alpha06

2025 年 2 月 12 日

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

新功能

  • Navigation Safe Args 操作现在通过 @CheckResult 注解生成,以确保它们被使用。( I14d4c , b/356323084 )

错误修复

  • 修复了 NavController 中的一个错误,当 backStack 状态保存为列表时,错误地尝试将其恢复到数组中。( Idfb9b )
  • 导航 2.8.7起:Navigation Safe Args 现在提供对可组合目标的支持。( I35320 , b/362791955 )

版本 2.9.0-alpha05

2025 年 1 月 29 日

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

错误修复

  • 修复了使用 Navigation Compose 时导致意外缩放动画的问题。( I480f4 , b/353294030 )
  • 导航 2.8.6起:通过 XML 提供的 NavDestination 标签将通过 NavType.get 进行解析,以确保遵循自定义 NavType 逻辑。( I7ec2f , b/388100796 )
  • 导航 2.8.6起:当导航到带有 dataPattern 的 activity 时,ActivityNavigator 现在将尝试使用参数的 NavType 对参数值进行编码。( I16376 , b/383616432 )
  • 导航 2.8.5起:修复了使用 Navigation Compose 并在当前动画结束的同一帧中调用导航时导致意外缩放动画的问题。( I26cb1 , b/353294030 )

版本 2.9.0-alpha04

2024 年 12 月 11 日

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

新功能

下表提供了 reified 和 KClass API。

reified KClass
composable<TestClass> { } composable(TestClass::class) { }
navigation<NestedGraph>(startDestination = TestClass::class) navigation(route = NestedGraph::class, startDestination = TestClass::class)
dialog<TestClass> {} dialog(TestClass::class) {}
navDeepLink<TestClass>(baseUri) navDeepLink(TestClass::class, baseUri)
NavDeepLink.Builder.setUriPattern<TestClass>(baseUri) NavDeepLink.Builder.setUriPattern(TestClass::class, baseUri)
NavDestinationBuilder.deepLink<TestDeepLink>(baseUri) { } NavDestinationBuilder.deepLink(TestDeepLink::class, baseUri) { }
navController.getBackStackEntry<TestClass>() navController.getBackStackEntry(TestClass::class)
navController.popBackStack<TestClass>(true) navController.popBackStack(TestClass::class, true)
navController.clearBackStack<TestClass>() navController.clearBackStack(TestClass::class)
NavOptions.setPopUpTo<TestClass>() NavOptions.setPopUpTo(TestClass::class)
navOptions { popUpTo<TestClass> {...} } navOptions { popUpTo(TestClass::class) {...} }
NavGraph.setStartDestination<TestClass>() NavGraph.setStartDestination(TestClass::class)
NavGraph.findNode<TestClass>() NavGraph.findNode(TestClass::class)
backStackEntry.toRoute<TestClass>() backStackEntry.toRoute(TestClass::class)
savedStateHandle.toRoute<TestClass>() savedStateHandle.toRoute(TestClass::class)

API 变更

  • Kotlin 特定的 NavGraph.setStartDestination 重载,用于类型安全,已从 Java 源代码中隐藏。( Ic640c , b/364634035 )

错误修复

  • 导航 2.8.5起:修复了当回栈被弹出到 1 个条目且系统返回在同一帧中触发时,NavHost 可能在 PredictiveBackHandler 内部抛出异常的问题。( I1a429 , b/375343407 )
  • 导航 2.8.5起:修复了更新图的 startDestinationNavDestination NullPointerException。( I99421 , b/361560785 )

外部贡献

版本 2.9.0-alpha03

2024 年 11 月 13 日

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

新功能

  • 导航类型安全现在支持值类作为路由或路由的参数类型。( I9344a , b/374347483 )

错误修复

  • 修复了当附加到 NavBackStackEntryLifecycleObserver 在包含的 Activity 或 Fragment 等宿主 LifecycleOwner 更改其生命周期状态时触发回栈更改时可能发生的 ConcurrentModificationException。( Ia9494 )

版本 2.9.0-alpha02

2024 年 10 月 30 日

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

外部贡献

  • 新的通用 NavController.handleDeepLink(request: NavDeepLinkRequest) 方法。感谢 Konstantin Tskhovrebov!( I3e228 )

版本 2.9.0-alpha01

2024 年 10 月 16 日

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

新功能

  • 自定义导航器现在可以将其目标标记为实现 SupportingPane 接口,这向 NavController 指示这些目标将与其他目标一起显示。例如,通过使用此接口,可以同时 RESUMED 多个目标。( Id5559 )
  • 导航 2.8.3起:为 navigation-commonnavigation-runtimenavigation-compose 模块添加了新的 lint 检查,以帮助识别任何未正确使用 @Serializable 注解的类型安全路由。此检查适用于所有 NavGraphBuilderNavDeepLinkBuilder 扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I28bda , b/362725816 )
  • 导航 2.8.3起:为 navigation-commonnavigation-runtimenavigation-compose 模块添加了新的 lint 检查,以帮助识别任何包含 Enum 参数且未正确使用 @Keep 注解的类型安全路由。此检查适用于所有 NavGraphBuilderNavDeepLinkBuilder 扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I2b46f , b/358687142 )

行为变更

  • 尝试使用以前 DESTROYEDNavController 现在将导致 IllegalStateException。( I520da , b/369616172 )

错误修复

  • 更新未找到 Enum 类异常,建议在混淆构建中 Enum 类被擦除时使用 @Keep 注解。( I90e79 , b/358137294 )

已知问题

  • Navigation 2.8.* 中添加的新 lint 规则存在一个问题,在尝试使用 Android Gradle Plugin 8.4+ 运行 lint 时会导致 Obsolete custom lint check 错误。( b/368070326 , b/371463741 )

版本 2.8

版本 2.8.9

2025 年 3 月 12 日

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

错误修复

  • 修复了在导航 2.8.8 中发现的一个回归问题,该问题要求深层链接必须与深层链接请求或 intent 的所有字段精确匹配才能被视为匹配。这导致包含部分字段匹配而没有其他字段的深层链接不再起作用。( Ie5e36 , b/399826566 )

版本 2.8.8

2025 年 2 月 26 日

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

错误修复

  • 修复了带有通配符路径的路由与添加的深层链接不匹配的 bug。( I7ea92 , b/389970341 )
  • NavDeepLink 匹配已修复,其中深层链接和深层链接请求必须在 URI、操作和 MIME 上精确匹配。如果仅一个或两个字段匹配,则不再允许匹配。( I3227f , b/395712033 )

已知问题

  • 由于处理 b/395712033 的工作,深层链接被错误地要求具有与深层链接请求和/或 Intent 相同的所有字段。深层链接应该只要求匹配它们所拥有的字段,而不包含的字段应该被忽略。这已在后续版本中作为 b/399826566 的一部分进行修复。

版本 2.8.7

2025 年 2 月 12 日

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

错误修复

  • Navigation Safe Args 现在提供对可组合目标的支持。( I35320 , b/362791955 )

版本 2.8.6

2025 年 1 月 29 日

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

错误修复

  • 通过 XML 提供的 NavDestination 标签将通过 NavType.get 进行解析,以确保遵循自定义 NavType 逻辑。( Id366d , b/388100796 )
  • 当导航到带有 dataPattern 的 activity 时,ActivityNavigator 现在将尝试使用参数的 NavType 对参数值进行编码。( I1a71d , b/383616432 )

版本 2.8.5

2024 年 12 月 11 日

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

错误修复

  • 修复了当回栈被弹出到 1 个条目且系统返回在同一帧中触发时,NavHost 可能在 PredictiveBackHandler 内部抛出异常的问题。( I1a429 , b/375343407 )
  • 修复了更新图的 startDestinationNavDestination NullPointerException。( I99421 , b/361560785 )
  • 修复了使用 Navigation Compose 并在当前动画结束的同一帧中调用导航时导致意外缩放动画的问题。( I26cb1 , b/353294030 )
  • 修复了当附加到 NavBackStackEntryLifecycleObserver 在包含的 Activity 或 Fragment 等宿主 LifecycleOwner 更改其生命周期状态时触发回栈更改时可能发生的 ConcurrentModificationException。( Ia9494 )

外部贡献

  • 导航类型安全现在支持 List<Enum> 作为路由的参数类型,而无需任何自定义 NavType。感谢 Csaba Kozák!( GH-725 , b/375559962 )

版本 2.8.4

2024 年 11 月 13 日

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

新功能

错误修复

版本 2.8.3

2024 年 10 月 16 日

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

新功能

  • navigation-commonnavigation-runtimenavigation-compose 模块添加了新的 lint 检查,以帮助识别任何未正确使用 @Serializable 注解的类型安全路由。此检查适用于所有 NavGraphBuilderNavDeepLinkBuilder 扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I28bda , b/362725816 )
  • navigation-commonnavigation-runtimenavigation-compose 模块添加了新的 lint 检查,以帮助识别任何包含 Enum 参数且未正确使用 @Keep 注解的类型安全路由。此检查适用于所有 NavGraphBuilderNavDeepLinkBuilder 扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I2b46f , b/358687142 )

错误修复

  • 修复了在 Navigation 2.8.* 中添加的新 lint 规则导致在尝试使用 Android Gradle Plugin 8.4+ 运行 lint 时出现 Obsolete custom lint check 错误的问题。( I1be3d , b/368070326 , b/371463741 )

已知问题

  • 当尝试使用 Lint 16 (AGP 8.7) 或更高版本运行 lint 时,导航 lint 将抛出 Obsolete custom lint check 错误。( b/371926651 )

版本 2.8.2

2024 年 10 月 2 日

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

新功能

  • 导航类型安全现在支持包含 DoubleDouble?DoubleArrayDoubleArray?List<Double>List<Double>? 的可序列化类,而无需任何自定义 NavType。( I570eb , Ibc4c0 , I37461 , I5bed4 , b/359245753 )

错误修复

  • 改进了导航未能将路由参数映射到 NavType 时的错误消息,新的错误消息将包含参数名称、参数完全限定名和路由的完全限定名。( Id8416 , b/346264232 )

版本 2.8.1

2024 年 9 月 18 日

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

新功能

  • 添加了一个新的 lint 规则,以确保在使用类型安全 API 尝试 popBackStack 时,使用接受具象化类类型的 popBackStack 函数。( Ief161 , b/358095343 )

错误修复

  • 导航现在要求传递给 NavGraphstartDestination 的路由包含所有必需参数的值,包括不可为空且没有默认值的参数。( I18e74 , b/362594265 )
  • Navigation safe args 现在增加了对不可为空字符串的支持,使得“null”值将被解析并按原样存储到捆绑包中。这与现有的行为不同,在现有行为中,“null”值被解析为空对象。此更改仅适用于不可为空的 String 类型。可空字符串保持不变。( I08b4a , b/348936238 )
  • 除了通过明确添加到目标的深层链接外,NavDestination 不能再通过深层链接进入。这也意味着您只能使用接受字符串路由的导航函数重载导航到目标的路由。这修复了一个可能导致深层链接到潜在受保护目标的漏洞。( Ie30e6 )

依赖项更新

  • Navigation Safe Args 现在依赖于 Kotlin 1.9.24,而不是 Kotlin 2.X,确保开发者无需强制更新。( a4129a )
  • Navigation Compose 现在依赖于Compose 1.7.2

版本 2.8.0

2024 年 9 月 4 日

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

自 2.7.0 以来的重要更改

Navigation 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 meets Type Safety 博客文章

Navigation Compose 预测性返回

  • Navigation Compose 现在通过 compose-animation 中的新 SeekableTransitionState API 支持预测性应用内返回。这允许您使用返回手势查看上一个目标并进行自定义过渡,然后决定是通过完成手势提交事务还是取消。

Navigation Fragment 可组合

  • 添加了一个新的 navigation-fragment-compose 工件,其中包含 NavHostFragmentComposableNavHostFragment 替代方案,允许您将可组合目标添加到您的 Navigation 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" />

其他更改

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

错误修复

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

版本 2.8.0-beta07

2024 年 8 月 7 日

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

已知问题

  • 由于 b/358137294,仅支持开箱即用的嵌套在另一个类中的枚举。顶级枚举将在下个版本中支持。

错误修复

  • 当导航到重复或共享的目标时,导航将优先从图中当前位置导航到最近匹配的目标。( Ic89a4 , b/352006850 )
  • safe args 中的导航现在添加了一个新的 NavType.EnumType。这意味着 Enum 类型不再需要自定义 NavType。请注意,EnumSerialName 必须是默认的完全限定名。( I66d22 , b/346475493 )
  • safe args 中的导航已添加对可空参数类型的内置支持,包括 Int?Long?Float?Boolean?Enum<*>?。( I32d13 ,I1c580 ,Ifba66 ,I978b0 ,Ide076 , b/351994237 )
  • NavGraphstartDestination 现在将使用默认参数值,如果传递给 NavGraphstartDestination 路由完全等于 startDestination.route。( I13762 , b/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 导航崩溃的问题。( I17b94 , b/294408596 )

版本 2.8.0-beta04

2024 年 6 月 26 日

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

错误修复

  • 导航现在支持在路径参数中使用空字符串进行导航。( Ic5dbd , b/339481310 )
  • 改进了直接在类字段上通过 @Serializable(with =...) 声明自定义序列化器时的错误消息,以阐明这目前是不支持的功能。( I052b0 , b/341319151 )
  • SavedStateHandleFactory 测试 API 现在可以在非 Android 测试中使用,但需要 Robolectric 支持使用 Bundles 进行参数解析。( I76cdc , b/340966212 )
  • 修复了使用 Compose 中的类型安全导航在进程死亡后恢复应用时恢复状态导致的崩溃。( Ia8f38 , b/341801005 )
  • 修复了 Navigation Compose 中的一个问题,即在取消预测性返回手势后,用户返回的 NavBackStackEntry 永远不会返回到 RESUMED 生命周期状态。这也确保了返回的目标能够正确地动画返回,而不是在滑动后突然出现。( I97a0c , b/346608857 )
  • 当使用 Navigation Compose 进行预测性返回时,被弹出的目标现在将具有正确的 z 轴顺序,在进入的目标上方正确地进行动画。( I2077b , b/345993681 )

版本 2.8.0-beta03

2024 年 6 月 12 日

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

API 变更

  • CollectionNavType 有一个新的抽象 emptyCollection() 方法。重写此方法以处理作为参数传入的空集合。( Ie4d84 , b/341723133 )

错误修复

  • 添加了关于 NavType.serializeAsValueserializeAsValues 的文档,以强调最终输出应该进行 URI 编码。( Ida6bd , b/344943214 )
  • 修复了使用空 CollectionNavType 参数调用 toRoute<T> 时崩溃的问题。当使用空 CollectionNavType 导航时,输出参数将是您的 Serializable 类上声明的默认值,或者如果没有默认值,则为 emptyCollection() 的返回值。( I84158 , Id630f , b/342672856 )

版本 2.8.0-beta02

2024 年 5 月 29 日

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

错误修复

  • 修复了使用可空自定义 NavType 时使用 NavBackStackEntry.toRoute 导致 ClassCastException 崩溃的问题。( I1c29b , b/342239473 )
  • 修复了导航回栈状态恢复问题,该问题是由于尝试恢复无法通过 ID 从当前目标访问的回栈条目而导致的。由于路由由 ID 支持,因此使用路由构建的目标也受到影响。这也修复了调用 clearBackStack() 导致的崩溃,该崩溃具有相同的底层问题。( I423c3 , b/339908057 )

版本 2.8.0-beta01

2024 年 5 月 14 日

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

API 变更

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

错误修复

  • 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 meets Type Safety 博客文章

新功能

  • navigation-fragment-compose 工件现在为 ComposableFragment 内的可组合方法提供了 LocalFragment 组合局部变量。( 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 工件,其中包含 NavHostFragmentComposableNavHostFragment 替代方案,允许您将 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 来为 Navigation Compose 中的过渡指定它。( 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 )

错误修复

  • 修复了导航中的一个问题,该问题导致 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 的 Navigation 现在依赖于 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 中发现的支持相匹配。(I731f4, b/299255572

错误修复

  • 修复了在使用 popUpTo 导航时中断另一个导航会导致 FragmentNavigator 崩溃的问题。(I3c848, b/301887045
  • 修复了系统返回键导致 currentDestination 未正确更新以匹配显示的 Fragment 的问题。(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 包含这些提交。

错误修复

  • 修复了使用 Fragment 的 Navigation 中导致 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 包含这些提交。

错误修复

  • Navigation 现在依赖于 Lifecycle 2.6.2,修复了 rememberSaveable 和 Navigation Compose 的 NavHost 之间的一个交互问题,该问题会导致目的地和任何 ViewModel 所拥有的 SavedStateHandle 实例的 rememberSaveable 状态在进程终止和重新创建后无法正确恢复。(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 包含这些提交。

错误修复

  • 修复了使用 Compose 的 Navigation 中可能导致在尝试访问 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

错误修复

  • 即使在 Activity 停止并恢复后,Navigation Compose 中的 NavHost 现在也能正确拦截系统返回调用。(Icb6de, b/279118447

依赖项更新

  • Navigation 现在依赖于 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 包含这些提交。

错误修复

  • 修复了作为 NavHost 一部分创建的 EnterTransitionExitTransition lambda 即使在 NavHost 从组合中移除后也可能保留在内存中的问题。(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 包含这些提交。

错误修复

  • Navigation Compose 现在为使用 popUpTo 选项的自定义过渡提供了正确的 Z 轴顺序。(/Ib1c3a, b/285153947

版本 2.7.0-beta01

2023 年 6 月 7 日

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

错误修复

  • 即使在 Activity 已经 STOPPEDRESUMED 后,Navigation Compose 中的 NavHost 现在也能正确拦截系统返回调用。(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 向后移植:修复了使用 Fragment 的 Navigation 中的一个问题,即使用 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 以将值序列化为字符串,从而允许序列化和反序列化(通过 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、action 和/或 mimetype 才能有效。

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

  • NavHostFragment 不再自行拦截系统返回按钮。这允许底层 FragmentManager 处理系统返回。这允许 Fragment 1.7.0-alpha01 及更高版本在 Android U 设备上提供应用内预测性返回动画。
  • 当与 Fragments 一起使用 Navigation 时,尝试手动执行将 Fragment 添加到 FragmentManager 的返回堆栈的 FragmentTransaction 现在将抛出 IllegalArgumentException。您应该始终通过 navigate() API 添加 Fragment。
  • 在导航 XML 文件的活动元素中,当使用精确字符串 ${applicationId} 作为 app:dataapp:dataPattern 属性中的占位符时,该占位符将在膨胀时自动填充上下文的 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 Library。
  • Navigation Safe Args 现在依赖于 Android Gradle Plugin 版本 7.3.0。这意味着它现在仅与 7.3.0+ 版本兼容。

自 2.5.0 以来的 NavigationUI 重要更改

  • 当将导航图的 ID 传递给 AppBarConfiguration(例如通过 Menu)时,NavigationUI 现在只将该导航图的起始目的地视为顶级目的地,而不是错误地将图中的每个目的地标记为顶级目的地。传递单个目的地 ID 的行为保持不变。此相同功能可通过 AppBarConfiguration 上的新 isTopLevelDestination 函数供您自己的代码使用。
  • NavigationUI 中用于与顶部应用栏协作的 setupWithNavController 集成现在将解析 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 包含这些提交。

错误修复

  • 修复了使用 Fragment 的 Navigation 中的一个问题,即使用 popUpTo 导航并从返回堆栈中弹出 Fragment 而不重新创建其视图会导致系统返回功能停止工作。(Ieb8d4, b/281726455

版本 2.6.0-rc01

2023 年 5 月 10 日

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

错误修复

  • 修复了使用 Fragment 的 Navigation 中的一个问题,即在 onResume() 生命周期回调中使用 popUpTo 导航移除 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

错误修复

  • 当与 Fragments 一起使用 Navigation 时,尝试手动执行将 Fragment 添加到 FragmentManager 的返回堆栈的 FragmentTransaction 现在将抛出 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 中的回归问题,该问题导致在使用 AnimationNavBackStackEntry 未移动到 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

已知问题

  • 当与 Fragments 一起使用 Navigation 时,如果使用 Animation API,NavBackStackEntry 的生命周期无法达到 RESUMED 状态。(b/269646882
  • 当与 Fragments 一起使用 Navigation 并使用 BottomNavigation 导航时,如果尝试恢复包含多个条目的返回堆栈,BottomMenuItem 未正确更新。(b/270447657
  • 当与 Fragments 一起使用 Navigation 时,恢复状态后,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 现在将等待进入和退出 Fragment 特殊效果完成,然后才将其最终 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
  • 当导航到具有 launchSingleTop 标志设置为 true 的相同目的地时,Navigation 现在将正确替换 DialogFragment 实例。(I45b5a, b/149572817
  • Navigation 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 以将值序列化为字符串,从而允许序列化和反序列化(通过 parseValue)完全封装在 NavType 类中。StringType 现在重写此方法以对给定的 String 调用 Uri.encode。(Ie5213, b/247637434
  • NavigationUI 现在在通过选定的 MenuItem 导航失败时提供日志。(I2af5a, b/247730357

错误修复

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

依赖项更新

  • Navigation 对动态功能模块的支持现在依赖于细粒度的 Play Feature Delivery Library。(Ib4ddc
  • Navigation Safe Args 现在依赖于 Android Gradle Plugin 版本 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 包含这些提交。

错误修复

  • Navigation 2.5.3 向后移植:当没有可用于组合 Crossfade 的目的地时,NavHost 将不再导致 NoSuchElementException。现在它只会跳过组合。(Ieb46e, b/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 函数供您自己的代码使用。(Ie936e, b/238496771

错误修复

  • navigation:navigation-fragment 组件现在依赖于 Fragment 版本 1.5.2。(I00ba4
  • 选择的菜单项在导航到 FloatingWindow 目的地(如对话框)时将不再更新。(I4cde8, b/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 值,将其转换为字符串值,而不是输出自动生成的资源整数。(I5f803, b/167959935
  • NavDeepLink 现在支持数组的默认值,这允许支持重复查询参数,这些参数将映射到参数的数组类型。NavType 现在还包含一个默认方法,可以重写该方法以组合两个解析的值。(Id68c3, b/209977108
  • 在导航 XML 文件的活动元素中,当使用精确字符串 ${applicationId} 作为 app:dataapp:dataPattern 属性中的占位符时,该占位符将在膨胀时自动填充上下文的 packageName。(Iaabde, b/234223561
  • 尝试使用 navDeepLink Kotlin DSL 创建空 NavDeepLink 现在将导致 lint 警告,指示深层链接需要 uri、action 和/或 mimetype 才能有效。(I08d2f, b/154038883

API 变更

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

行为变更

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

错误修复

  • Navigation 2.5.2 向后移植:动态导航现在会在导航到其他模块中的活动目的地之前正确尝试安装它们。(Ia2c16, b/240292838
  • Navigation 2.5.2 向后移植:当导航到相同目的地并将 launchSingleTop 标志设置为 true 时,Navigation 现在将正确替换 Fragment 实例。(I5a2f1, b/237374580
  • Navigation 2.5.2 向后移植:修复了由于导航到与新弹出的起始目的地共享父级的双重嵌套图导致的 IllegalStateException。(I9f7cb, b/243778589

版本 2.5

版本 2.5.3

2022 年 10 月 24 日

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

错误修复

  • 当没有可用于组合 Crossfade 的目的地时,NavHost 将不再导致 NoSuchElementException。现在它只会跳过组合。(Ieb46e, b/253299416
  • 修复了当目的地从返回堆栈中弹出时,已保存的 Compose 状态(例如,rememberSaveable 的用法)未被遗忘和移除的问题。(I64949

版本 2.5.2

2022 年 9 月 7 日

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

错误修复

  • 动态导航现在会在导航到其他模块中的活动目的地之前正确尝试安装它们。(Ia2c16, b/240292838
  • 当导航到相同目的地并将 launchSingleTop 标志设置为 true 时,Navigation 现在将正确替换 Fragment 实例。(I5a2f1, b/237374580
  • 修复了由于导航到与新弹出的起始目的地共享父级的双重嵌套图导致的 IllegalStateException。(I9f7cb, b/243778589

依赖项更新

版本 2.5.1

2022 年 7 月 27 日

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

错误修复

  • Navigation Safe Args 在使用保存在 Bundle 中的自定义参数类型时,将不再导致生成的类中出现弃用警告。(Id86ed, b/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 版本的兼容性。
  • 添加了对使用 namespace 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 和命名空间(没有 applicationId,或者 applicationId 和命名空间不同)时将不再崩溃。(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 文件中的 <activity> 元素内放置 <deeplink> 元素。(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 现在支持使用 CreationExtras,即使它已使用 SavedStateRegistryOwner 初始化。如果提供了 extras,则忽略已初始化的参数。(I6c43b, b/224844583
  • NavDeepLink 现在可以解析带有一个没有值的查询参数的 Uris。(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
  • 当与 NavBackStackEntries 一起使用 CreationExtras 来创建 ViewModel 时,它现在将正常工作。(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 包含这些提交。

错误修复

  • Navigation 2.4.1 向后移植:当使用带有嵌套图的视图绑定时,NavHostFragment 现在将正确设置 OnBackPressedDispatcher。(Ifbb51, b/214577959
  • Navigation 2.4.1 向后移植:当通过多个嵌套 NavGraph 进行深层链接时,返回堆栈现在将正确包含中间起始目的地。(I504c0, b/214383060

版本 2.5.0-alpha01

2022 年 1 月 26 日

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

新功能

错误修复

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

Safe Args

  • 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 现在将正确设置 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 将不再兼容 Android Studio 7.0 之前的版本,但现在兼容 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 Artifact 都已用 Kotlin 重写。这改善了使用泛型(例如 NavType 子类)的类的可空性。所有以前属于 -ktx Artifact 的 Kotlin 扩展函数都已移至其各自的主 Artifact。-ktx Artifact 将继续发布,但完全为空。
  • navigation-fragment Artifact 现在包含通过新的 AbstractListDetailFragment 实现的预构建的双窗格布局。此片段使用 SlidingPaneLayout 来管理列表窗格(由您的子类提供)和详细信息窗格,后者使用 NavHostFragment 作为其实现,如我们的示例实现所示。
  • NavController 上的 currentBackStackEntryAsFlow() 方法提供了一个 Flow,该 Flow 在当前 NavBackStackEntry 更改时发出。此 Flow 可以作为手动管理 OnDestinationChangedListener 的替代方案。
  • NavController 现在通过实验性的 visibleEntries 属性提供了以 StateFlow 形式检索所有可见 NavBackStackEntry 实例的列表的功能。
  • 现在可以扩展 NavType 类以创建自定义 NavTypes。自定义类型仅在以编程方式构建导航图时受支持,例如通过 Navigation Graph Kotlin DSL
  • Navigation 现在提供了 findStartDestination()getHierarchy() API,可用于帮助实现自定义 NavigationUI。findStartDestination()NavGraph 上的扩展函数,它将定位导航到图时实际显示的起始目的地,即使 startDestination 本身是嵌套的 NavGraphgetHierarchy()NavDestination 上的一个函数,可用于验证给定目的地是否在另一个目的地的层次结构中。

    val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
    
  • NavigationUI 方法以前接受 BottomNavigationView,现已更新为接受 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 Kotlin 属性已弃用,取而代之的是 popUpToId
  • 已弃用 getStartDestination() API,取而代之的是 getStartDestinationId()

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

Navigation Compose

navigation-compose 工件提供了Navigation ComponentJetpack 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 Navigation 指南

多个返回堆栈

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

作为此更改的一部分,NavigationUIonNavDestinationSelected()BottomNavigationView.setupWithNavController()NavigationView.setupWithNavController() 方法现在会自动保存和恢复弹出目的地的状态,从而无需任何代码更改即可支持多个返回堆栈。当 Navigation 与 Fragments 一起使用时,这是与多个返回堆栈集成推荐的方式。

保存和恢复状态的底层 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() 和接受附加 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,并且现在将 setGraph()popBackStack()navigateUp()navigate()(更新 NavBackStackEntry Lifecycle 的方法)标记为 @MainThread,使 Navigation 与 Lifecycle 2.3.0 中引入的主线程强制执行保持一致。
  • 深层链接现在验证 Uri 中是否存在所有必需的参数(即没有默认值的参数)。
  • NavDeepLink 解析的参数现在将井号与问号一样视为路径段之间的分隔符,从而防止参数跨越井号。
  • 生成动作时,Safe Args 生成的 Kotlin 代码现在将没有默认值的参数放在有默认值的参数之前。
  • 生成参数时,Safe Args 现在将没有默认值的参数放在有默认值的参数之前。
  • Safe-Args 现在依赖于 Android Gradle Plugin 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 Plugin 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
  • 当 NavController 恢复后,使用过渡弹出嵌套目的地时,NavController 不再崩溃。(I0f7c9, b/205021623
  • 使用无效 startDestination 时的错误消息现在将默认为起始目的地的路由(如果可用)。(I86b9d, b/208041894

Navigation Compose Bug 修复

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

Safe Args Bug 修复

  • SafeArgs 在进程终止后尝试恢复自定义 Parcelable 数组时不再崩溃。(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 会返回 true 的问题,即使您实际上没有 navigate() 到该导航图。它现在使用 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 与 Fragments 一起使用。(I901e3, b/201446416

API 变更

  • visibleEntries API 现在是实验性的。(I93f6f

错误修复

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

错误修复

  • 动态导航在 Activity 重新创建时不再崩溃。(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 生成的 Kotlin 代码现在将没有默认值的参数放在有默认值的参数之前。(Idb697, b/188855904
  • 深层链接现在验证 Uri 中是否存在所有必需的参数(即没有默认值的参数)。(#204, b/185527157

错误修复

  • 在 composable() 中使用 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
  • 当使用 Navigation Compose 和多个返回堆栈时,重新选择同一个选项卡将不再导致空白屏幕。(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 现在在导航到目的地时始终使用交叉淡入淡出。(I07049, b/172112072
  • 您现在可以更改 NavHost 的图。具有相同起始目的地和图中目的地的图将被视为相等,并且不会清除 NavController 返回堆栈。(I0b8db, b/175392262

错误修复

  • 修复了在附加到 NavBackStackEntryLifecycleObserver 中调用 popBackStack() 时由于 NavController 状态的重入更新导致的 NoSuchElementException。(I64621
  • AbstractListDetailFragment 现在允许在不使用 AbstractListDetailFragment 时,将 SlidingPaneLayout 完全从您的 APK 中剥离。(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 目的地。这些对话框目的地将显示在可组合的 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
  • 修复了导航到使用具有默认值 @nullstring[] 参数的目的地时出现的 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,允许选择不保存状态。虽然始终保存状态是正确的行为,但仍有一些已弃用的库(即保留片段)无法在保存状态时得到支持,因此这为应用程序提供了逐步从任何不受支持的 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 在使用 OnDestinationChangedListeners 列表进行操作时,不再从 onDestinationChanged 回调中抛出 ConcurrentModificationException。(Ib1707, b/188860458

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

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

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

依赖项更新

  • Safe-Args 现在依赖于 Android Gradle Plugin 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 更改时就会发出。此流可以用作手动管理 OnDestinationChangedListener 的替代方案。(I19c4a, #89, b/163947280

多个返回堆栈

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

作为此更改的一部分,NavigationUIonNavDestinationSelected()BottomNavigationView.setupWithNavController()NavigationView.setupWithNavController() 方法现在会自动保存和恢复弹出目的地的状态,从而无需任何代码更改即可支持多个返回堆栈。当 Navigation 与 Fragments 一起使用时,这是与多个返回堆栈集成推荐的方式。(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() 和接受附加 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 和 Navigation with Fragments 中用于 <fragment> 目的地的 FragmentNavigatorDynamicFragmentNavigator 都已更新,以使用新的 Navigator 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。(I59c73, b/172823546
  • 已弃用 getStartDestination() API,取而代之的是 getStartDestinationId()。(I0887f, b/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 现在支持将多个不同的目的地添加到生成的返回堆栈中。(I3ee0d, b/147913689
  • 添加 DynamicNavHostFragment 的工厂函数(Icd515, b/175222619
  • NavBackStackEntry 的唯一 ID 现在作为其公共 API 的一部分公开。(Ie033a
  • NamedNavArgumentnameargument 字段以及解构函数现在是公共的。(#174, b/181320559
  • 引入了一个新的 NavBackStackEntry#provideToCompositionLocals 扩展,它将 NavBackStackEntry 提供给相关的组合局部变量。(#175, b/187229439

Safe Args

  • 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。(#172, b/183990444

行为变更

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

Compose 兼容性

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

错误修复

  • 修复了尾随参数占位符优先于具有匹配精确后缀的深层链接的问题。(#153, b/184072811
  • NavHostFragment 现在支持使用与默认 DialogFragmentNavigator 相同的 @Navigator.Name("dialog") 的自定义 Navigators。(Ib1c2c, b/175979140
  • 改进了 NavigatorProvider#addNavigator 的行为,以确保重复调用同一实例不会导致问题。(#176, b/187443146

外部贡献

  • 感谢 simonschiller 为 Safe Args 构建支持,为每个 NavArgs 类生成 fromSavedStateHandle() 方法。(#122, b/136967621
  • 感谢 Bradleycorn 使从深层链接解析 Enum 参数不区分大小写。(#152, b/135857840
  • 感谢 osipxd 修复了尾随参数占位符优先于具有匹配精确后缀的深层链接的问题。(#153, b/184072811
  • 感谢 tatocaster 更新 Safe Args 以依赖于 KotlinPoet 1.8.0。(#172, b/183990444
  • 感谢 jossiwolf 使 NamedNavArgumentnameargument 字段以及解构函数成为公共的。(#174, b/181320559
  • 感谢 jossiwolf 引入了一个新的 NavBackStackEntry#provideToCompositionLocals 扩展,它将 NavBackStackEntry 提供给相关的组合局部变量。(#175, b/187229439
  • 感谢 jossiwolf 改进了 NavigatorProvider#addNavigator 的行为,以确保重复调用同一实例不会导致问题。(#176, b/187443146

版本 1.0.0-alpha10

2021 年 4 月 7 日

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

API 变更

  • NavHost 现在接受一个 Modifier,该修饰符传递给包装目的地可组合项的可组合容器。(I85aca, b/175125483

错误修复

  • 即使未找到 OnBackPressedDispatcherOwner(例如在预览 NavHost 时),NavHost 现在也能正常工作。(I7d8b4
  • Navigation Compose 现在依赖于 Navigation 2.3.5,修复了在 NavHost 目的地内部使用 BackHandler 时的问题。(I7e63b, b/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 对象的问题的修复。(I65c24, b/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 的状态将与目的地一起保存和恢复。(I435d7, b/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 变更

  • Navigation 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 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 导航时,您现在可以通过 KEY_DEEP_LINK_INTENT 从参数中获取 intent,从而访问结果目的地中的 Uri、操作和 MIME 类型,这与外部深层链接已有的功能相同。(I975c3, b/181521877

错误修复

  • OnBackPressedCallbacks(将 NavBackStackEntry 作为 LifecycleOwner 添加到调度程序)现在可以在 Activity 生命周期处于 STOPPED 后再 STARTED 的情况下,正确拦截返回事件 (Iff94f, b/182284739)。
  • 深层链接域解析现在不区分大小写,确保 www.example.com 既能匹配 www.example.com 又能匹配 www.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)。
  • 使用 Java 时,Safe-Args 现在会在正确的方法上添加抑制注解。 (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 的 Activity 会导致 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> 目标时,无法导航到 Activity。 (I22e34, b/171364502)
  • 修复了 navigation-dynamic-features-fragment 会导致多次导航到新安装目标的问题。 (aosp/1486056, b/169636207)
  • 修复了在使用 launchSingleTop 时,默认参数不会发送到 OnDestinationChangedListener 实例的问题。 (I2c5cb)
  • 修复了导航到嵌套导航图时,不会在返回堆栈上创建新的图实例的问题。 (Ifc831)
  • 修复了使用 navigate() 并在 popUpTo 中删除了导航图中的最后一个目标时,不会立即销毁并从返回堆栈中删除导航图本身的问题。 (I910a3)
  • Navigation SafeArgs 现在使用 KotlinPoet 1.7.2 版,该版本增加了对 Kotlin 显式 API 模式的支持。 (I918b5)
  • NavHostFragment.findNavController(Fragment) 除了检查 Fragment 层次结构和 Fragment 的视图层次结构外,现在还会检查 DialogFragment 的根装饰视图。这允许您使用 FragmentScenarioNavigation.setViewNavController() 测试使用 Navigation 的对话框片段。 (I69e0d)

版本 2.3.1

版本 2.3.1

2020 年 10 月 14 日

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

新功能

  • Navigation UI 中已添加默认 Animator 资源,建议替代默认动画资源。 (b/167430145)
  • NavOptions 现在会覆盖 hashcode 和 equals 方法 (b/161586466)
  • Navigation 现在在“无 ID 目标” IllegalArgumentException 中包含当前目标,这应该可以改善开发人员的调试体验。 (b/168311416)

错误修复

  • 即使生成的参数类名超过 100 个字符,Safe Args 也不会再换行。 (b/168584987)

依赖项更改

  • navigation-ui 现在依赖于 DrawerLayout 1.1.1,确保 NavigationUI 即使在使用 LOCK_MODE_LOCKED_CLOSEDLOCK_MODE_LOCKED_OPEN 时也能够打开抽屉。 (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 Artifact 允许您导航到功能模块中定义的目标,并根据需要自动处理功能模块的安装。有关更多信息,请参阅使用功能模块进行导航
  • 导航测试navigation-testing Artifact 提供了 TestNavHostController,允许您设置当前目标并在导航操作后验证返回堆栈。有关更多信息,请参阅测试导航
  • 返回结果:与导航返回堆栈上每个目标关联的 NavBackStackEntry 现在允许您访问一个 SavedStateHandle,它适用于存储应与特定返回堆栈条目关联的少量保存状态。有关更多信息,请参阅返回结果到上一个目标
  • NavigationUIOpenable 的支持NavigationUI 中所有 DrawerLayout 的用法已被更通用的 Openable 接口取代,该接口在 CustomView 1.1.0 中添加,并由 DrawerLayout 1.1.0 中的 DrawerLayout 实现。
  • 深层链接中的 Action 和 Mime Type 支持:深层链接已扩展到支持 app:actionapp:mimeType,除了之前可用的 app:uriNavController 现在通过新的 NavDeepLinkRequest 类支持通过这些字段的任何组合进行导航。有关更多信息,请参阅使用 NavDeepLinkRequest 导航

已知问题

  • 对深层链接 action 和 mime 类型的支持尚未在 Manifest Merger 中提供。在此工作完成之前,清单中 <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 现在会正确更新其参数,并且更新后的参数会发送到所有 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/136573074, b/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)
  • Navigation Graph Kotlin DSL 现在公开了一个用于 Action 的 defaultArguments Map,与 Navigation XML 文件中 <action> 元素设置默认值的功能相对应。 (b/150345605)

错误修复

  • 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 中增加了对功能模块活动和片段目标的支援。 (b/148969800)

API 变更

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

错误修复

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

依赖项更新

  • Navigation Dynamic Features Artifacts 现在依赖于 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 已发布。此版本中包含的提交可以在此处找到。

新功能

  • NavBackStackEntry 现在允许您访问一个 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 已发布。此版本中包含的提交可以在此处找到。

新特性

  • 新的 navigation-testing Artifact 提供了 TestNavHostController 类。此类提供了一种替代模拟 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 开始:navigation-uiDrawerArrowDrawable 的 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 包含这些提交。

错误修复

  • 修复了当您的 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)
  • navigation-uiDrawerArrowDrawable 的 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 集成SavedStateViewModelFactory 现在是使用 by navGraphViewModels()ViewModelProvider 构造函数时,默认使用的工厂,该构造函数使用 NavController.getBackStackEntry()NavController.getViewModelStoreOwner() 返回的 ViewModelStoreOwner
  • 深层链接的查询参数支持:带有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可空的参数在匹配深层链接时现在是可选的。
  • 改进的动画支持NavHostFragment 现在使用来自 Fragment 1.2.0FragmentContainerView,修复了动画 Z 顺序问题和窗口内边距分发到片段的问题。

版本 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)
  • 当与 FragmentContainerView 一起使用时,NavHostFragment 现在在配置更改后正确恢复图。 (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 已发布。此版本中包含的提交可以在此处找到。

新特性

  • 带有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可空的参数在匹配深层链接时现在是可选的。 (b/133273839)
  • 您现在可以调用 NavController.getBackStackEntry(),传入返回堆栈上目标或导航图的 ID。返回的 NavBackStackEntry 除了提供用于启动该目标的参数外,还提供了 Navigation 驱动的 LifecycleOwnerViewModelStoreOwner(与 NavController.getViewModelStoreOwner() 返回的相同)和 SavedStateRegistryOwner。 (aosp/1101691, aosp/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 以来的重要更改

  • 将 ViewModels 范围限定为导航图:您现在可以使用 -ktx 库的 Kotlin 用户通过 by navGraphViewModels() 属性委托,或通过使用添加到 NavControllergetViewModelStoreOwner() API 来创建范围限定在导航图级别的 ViewModel。有关更多信息,请参阅在目标之间共享与 UI 相关的数据
  • 对话框目标:您现在可以创建 <dialog> 目标,当您 navigate 到它们时,它们将显示 DialogFragmentNavHostFragment 默认支持对话框目标。有关更多信息,请参阅从 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 现在会为 Up 按钮的移除添加动画。 (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 Artifact。可以通过 XML 添加的自定义导航器应使用此属性,以与 Navigation Editor 的主机面板集成。 (b/133880955)

API 更改

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

行为变更

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

Bug 修复

  • Navigation 现在会抑制处理深层链接时重新创建 activity 发生的动画,修复了视觉闪烁问题。 (b/130362979)
  • 修复了在添加初始片段时弹出片段时,导航返回堆栈会不同步的错误。 (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)

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 已发布。此版本中包含的提交可以在此处找到。

已知问题

  • NavHostFragment 尽管使用 app:defaultNavHost="false",但仍会拦截系统返回按钮事件。b/132077777

新特性

  • 您现在可以创建 <dialog> 目标,当您 navigate 到它们时,它们将显示 DialogFragmentNavHostFragment 默认支持对话框目标。b/80267254
  • 除了使用资源 ID 或 NavDirections 实例调用 navigate 外,您现在可以通过 Uri 进行导航,它使用您已添加到目标以导航到正确目标的 <deepLink>b/110412864

行为变更

  • NavigationUI 提供的默认动画已从 400ms 加速到 220ms,以匹配 activity 和 fragment 的默认动画速度。b/130055522

API 更改

  • NavHostFragmentcreateFragmentNavigator() 方法已被弃用,其功能已移至新的 onCreateNavController() 方法,以更清楚地表明这是当子类化 NavHostFragment 时添加自定义导航器的正确入口点。b/122802849
  • 已向 NavDestination 添加了 hasDeepLink() 方法,允许您检查给定 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 已发布。此版本中包含的提交可以在此处找到。

新特性

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

API 更改

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

Bug 修复

  • <activity> 目标的 android:name 不再在膨胀时解析为 Class,从而避免了使用动态功能时出现 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 的新 Artifact,并将其依赖项更改为 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
}

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

版本 1.0.0-rc01

2019 年 2 月 21 日

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

错误修复

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

版本 1.0.0-beta02

2019 年 2 月 12 日

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

新功能

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

行为变更

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

错误修复

  • popBackStack()navigateUp 现在在弹出返回堆栈上的最后一个目标时正确返回 false,修复了 1.0.0-beta01 中引入的回归问题。b/123933201
  • Navigation 现在在恢复保存的实例状态时正确设置 ClassLoader,避免了在使用 Navigator 保存状态或发送到 NavDestination 的参数中自定义类时出现的问题。b/123893858
  • 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 Plugin 3.3.0 aosp/888413
  • Safe Args 现在依赖于 Kotlin 1.3.20 aosp/888414

错误修复

  • Safe Args 现在可以在所有版本的 Android Gradle Plugin 上用于库和功能模块。b/121304903
  • 修复了导致单个 popBackStack() 操作将返回堆栈顶部所有目标副本弹出,而不是一次只弹出一个目标的回归问题。b/123552990
  • 修复了 FragmentNavigator 状态与 NavController 状态不同步的问题,导致在尝试恢复返回堆栈时出现 IllegalStateExceptionb/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 插件仍然可用的 Builder 模式。b/110263087

行为变更

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

破坏性更改

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

错误修复

  • NavDeepLinkBuilder 现在通过使用您传入的参数来确定唯一性,从而正确处理到同一目标的多个同时 PendingIntentb/120042732
  • 当使用嵌套的 NavHostFragment 或其他子 Fragment 及其返回堆栈时,NavController 现在可以正确处理 popBackStack() 操作。b/122770335
  • NavigationUI 现在正确设置 Up 按钮的内容描述。b/120395362
  • Safe Args 生成的 Directions 类现在正确处理与目标操作具有相同 ID 的全局操作。b/122962504
  • equals() 返回 true 时,Safe Args 生成的 NavDirections 类的 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 的单 Activity 演讲中进行了详细讨论,我们还将努力提供更多专门关于 Navigation 测试的文档。

新功能

  • NavigationUI 方法一起使用时,menuCategory="secondary"MenuItem 将不再弹出返回堆栈。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 Plugin 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
  • Fragment 的创建已移至 FragmentNavigator,使得将 Fragment 创建委托给 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

错误修复

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

Safe Args

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

版本 1.0.0-alpha07

2018 年 10 月 29 日

新功能

破坏性更改

  • navigation-testing-ktx 模块已并入 navigation-testing artifact,将不再发布。
  • navigation-testing 工件现在依赖于 Kotlin 标准库。API 已更改为更符合 Kotlin 约定,但您可以继续将其用于 Java 编写的测试。
  • 不再支持元数据清单注册的导航图。b/118355937
  • 操作不能再附加到 <activity> 目标。aosp/785539

错误修复

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

Safe Args

  • Safe args 现在对 Android Gradle Plugin 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

Safe Args

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

版本 1.0.0-alpha05

2018 年 8 月 10 日

错误修复

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

版本 1.0.0-alpha04

2018 年 7 月 19 日

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

API / 行为更改

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

Safe Args

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

错误修复

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

版本 1.0.0-alpha03

2018 年 7 月 12 日

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

API / 行为更改

  • 已为 Toolbar 添加 NavigationUI.setupWithNavController 方法 b/109868820
  • 已为 CollapsingToolbarLayout 添加 NavigationUI.setupWithNavController 方法 b/110887183
  • 当返回堆栈为空或给定目标 ID 不在返回堆栈中时,popBackStack() 现在返回 false b/110893637
  • FragmentNavigator 现在在 FragmentManager 保存状态后忽略导航操作,避免“Can not perform this action after onSaveInstanceState”异常 b/110987825

Safe Args

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

错误修复

  • 修复了在 Fragment 生命周期方法期间导航时的问题 b/109916080
  • 修复了多次通过嵌套图导航时的问题 b/110178671
  • 修复了使用 setPopUpTo 和图中第一个目标时的问题 b/109909461
  • 修复了所有 app:defaultValue 值都作为字符串传递的问题 b/110710788
  • Android Gradle Plugin 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 现在会对从深层链接 URL 解析的参数进行 URL 解码。b/79982454

错误修复

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

  • Navigation 现在依赖于 Support Library 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