导航

导航是一个用于在 Android 应用中目标之间进行导航的框架,无论目标是作为片段、活动还是其他组件实现,它都提供一致的 API。
最新更新 稳定版 候选版 Beta 版 Alpha 版
2024年11月13日 2.8.4 - - 2.9.0-alpha03

声明依赖项

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

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

Groovy

dependencies {
  def nav_version = "2.8.4"

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

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

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

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

}

Kotlin

dependencies {
  val nav_version = "2.8.4"

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

}

Safe Args

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

Groovy

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

Kotlin

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

2024年11月13日

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

新功能

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

错误修复

  • 修复了当附加到NavBackStackEntryLifecycleObserver在宿主LifecycleOwner(例如包含的 Activity 或 Fragment)更改其生命周期状态时触发对回退栈的更改时可能发生的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接口,这表示这些目标将与其他目标一起显示。例如,通过使用此接口,可以同时RESUMED多个目标。(Id5559
  • 来自Navigation 2.8.3:为navigation-commonnavigation-runtimenavigation-compose模块添加了新的 lint 检查,以帮助识别任何未用@Serializable正确注释的类型安全路由。此检查适用于所有NavGraphBuilderNavDeepLinkBuilder扩展函数。(I4a259I95402Ie601aId8c6eI28bdab/362725816
  • 来自Navigation 2.8.3:为navigation-commonnavigation-runtimenavigation-compose模块添加了新的 lint 检查,以帮助识别任何带有未用@Keep正确注释的枚举参数的类型安全路由。此检查适用于所有NavGraphBuilderNavDeepLinkBuilder扩展函数。(I4a259I95402Ie601aId8c6eI2b46fb/358687142

行为更改

  • 尝试使用先前已DESTROYEDNavController现在将导致IllegalStateException。(I520dab/369616172

错误修复

  • 将枚举类未找到异常更新为建议在最小化构建中删除枚举类时使用@Keep注释。(I90e79b/358137294

已知问题

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

2.8 版

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扩展函数。(I4a259I95402Ie601aId8c6eI28bdab/362725816
  • navigation-commonnavigation-runtimenavigation-compose模块添加了新的 lint 检查,以帮助识别任何带有未用@Keep正确注释的枚举参数的类型安全路由。此检查适用于所有NavGraphBuilderNavDeepLinkBuilder扩展函数。(I4a259I95402Ie601aId8c6eI2b46fb/358687142

错误修复

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

已知问题

  • 当尝试使用 Lint 16 (AGP 8.7) 或更高版本运行 lint 时,Navigation 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。(I570ebIbc4c0I37461I5bed4b/359245753

错误修复

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

2.8.1 版

2024 年 9 月 18 日

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

新功能

  • 添加了一个新的 lint 规则,以确保在尝试使用类型安全 API popBackStack时使用带具现化类类型的popBackStack函数。(Ief161b/358095343

错误修复

  • Navigation 现在要求传递给NavGraphstartDestination的路由包含所有必需参数的值,其中包括不可为空且没有默认值的那些参数。(I18e74b/362594265
  • Navigation 安全参数已添加对不可为空字符串的支持,以便按原样解析“null”值并将其存储到 bundle 中。这与现有的行为有所不同,在现有的行为中,“null”值被解析为 null 对象。此更改仅适用于不可为空的字符串类型。可为空的字符串保持不变。(I08b4ab/348936238
  • NavDestination 现在只能通过显式添加到目标的深层链接进行深层链接。这也意味着您只能使用采用字符串路由的 navigate 函数重载来导航到目标的路由。这修复了一个漏洞,该漏洞使得可以深层链接到潜在受保护的目标。(Ie30e6

依赖项更新

  • Navigation Safe Args 现在依赖于 Kotlin 1.9.24,而不是 Kotlin 2.X,确保开发人员不会被迫更新。(a4129a
  • 导航组合现在依赖于 Compose 1.7.2

2.8.0版本

2024年9月4日

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

自 2.7.0 版本以来的重要更改

导航 Kotlin DSL 类型安全

  • 导航现在为 Kotlin DSL(由导航组合使用)提供类型安全,使用 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)
        }
    }

请参阅 导航组合满足类型安全博客文章,了解更多信息。

导航组合预测返回

  • 导航组合现在通过 compose-animation 中新的 SeekableTransitionState API 提供对预测应用内返回的支持。这允许您使用返回手势查看上一个目标以及您的自定义过渡,然后决定是通过完成的手势提交事务还是取消。

导航片段组合

  • 添加了一个新的 navigation-fragment-compose构件,其中包含 ComposableNavHostFragment,它是 NavHostFragment 的替代方案,允许您将可组合的目标添加到导航 XML 文件中。每个 composable 目标必须表示为顶级、无参数的 @Composable 方法,其完全限定名称用作每个目标上的 android:name 属性。导航到这些目标之一时,将创建一个包含片段以显示可组合的内容。
  // In HomeScreen.kt
  @Composable
  fun HomeScreen() {
    // Your Composable content here
  }

  // In your navigation.xml
  <composable
    android:id="@+id/home_screen"
    android:name="com.example.HomeScreenKt\$HomeScreen" />

其他更改

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

2.8.0-rc01 版本

2024年8月21日

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

错误修复

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

2.8.0-beta07 版本

2024年8月7日

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

已知问题

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

错误修复

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

2.8.0-beta06 版本

2024年7月24日

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

错误修复

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

2.8.0-beta05 版本

2024年7月10日

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

错误修复

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

2.8.0-beta04 版本

2024年6月26日

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

错误修复

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

2.8.0-beta03 版本

2024年6月12日

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

API 变更

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

错误修复

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

2.8.0-beta02 版本

2024年5月29日

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

错误修复

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

2.8.0-beta01 版本

2024年5月14日

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

API 变更

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

错误修复

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

2.8.0-alpha08 版本

2024年5月1日

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

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-fragment-compose构件现在提供了一个LocalFragment 组合局部变量,用于ComposableFragment 中的可组合方法。(If35e5
  • NavType现在内置支持 Int、String、Boolean、Float 和 Long 的列表。(I4b6ddIa914cb/188693139

2.8.0-alpha07 版本

2024年4月17日

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

新功能

  • 添加了一个新的 navigation-fragment-compose 构件,其中包含一个 ComposableNavHostFragment,它可以替代 NavHostFragment,允许您将 composable 目标添加到您的 Navigation XML 文件中。每个 composable 目标必须表示为顶级、无参数的 @Composable 方法,其全限定名用作每个目标上的 android:name 属性。导航到这些目标之一时,将创建一个包含片段来显示可组合内容。(I0ef2eb/265480755

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

API 变更

2.8.0-alpha06 版本

2024年4月3日

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

API 变更

错误修复

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

2.8.0-alpha05 版本

2024年3月20日

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

新功能

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

API 变更

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

错误修复

  • 深度链接中的查询参数现在允许使用大括号括起来的 参数名称(例如 {argName}) 作为基于字符串的 NavTypes 的有效值。这修复了此类值对于所有类型都被视为无效(或值不存在)的问题。(I18302b/327274038
  • 现在,支持路由的 NavController 函数(例如 navigatepopBackStack)可以正确匹配填充了数组 NavTypes 参数的路由。(Iea805b/327229511

2.8.0-alpha04 版本

2024年3月6日

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

新功能

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

错误修复

  • 修复了在 Compose Navigation 中使用系统返回键(无手势操作)时,NavHost无法正确显示过渡动画的问题。(Iceeaeb/325998468

版本 2.8.0-alpha03

2024年2月21日

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

API 变更

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

错误修复

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

依赖项更新

版本 2.8.0-alpha02

2024年2月7日

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

新功能

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

版本 2.8.0-alpha01

2024年1月24日

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

错误修复

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

依赖项更新

外部贡献

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

版本 2.7.7

版本 2.7.7

2024年2月7日

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

错误修复

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

外部贡献

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

版本 2.7.6

版本 2.7.6

2023年12月13日

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

错误修复

  • NavGraphequals() 函数现在会正确考虑其他图形的节点,而不仅仅是调用图形的节点。这将确保具有不同 ID 节点的图形不再被认为是相等的(I401cbb/311414915

版本 2.7.5

版本 2.7.5

2023年11月1日

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

性能改进

  • 极大地提高了比较两个图形的性能(时间和分配数量)。这意味着诸如 setGraph 之类的内部比较新图形与现有图形的调用速度更快,并且导致跳过的帧更少。感谢 Michał Z 进行的彻底分析,从而实现了这一改进。(I6ad62
  • NavHost 现在将在第一次组合传递时呈现起始目的地,而不必等到第二次传递来读取更新后的状态。(I439a7b/304852206

错误修复

  • 修复了如果使用完全相同的图形多次调用 setGraph,并且图形中存在一个目的地包含连接两个目的地的操作,则回退栈将被弹出。
  • 快速连续导航到并关闭的对话框将不再泄漏到 NavController.visibleEntries 列表中。(I67586b/287969970
  • 弹出条目后发生配置更改时,如果 saveState 为 false,条目的 ViewModel 现在将被正确清除。(Idf242b/298164648
  • 修复了如果回退栈在配置更改或调用 setGraph 之前完全为空,则 NavController 可能多次处理相同的深层链接的问题,只有当传入的 Intent 设置了 FLAG_ACTIVITY_NEW_TASK 标志时才会出现此问题。(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 中提供的支持相匹配。(I731f4b/299255572

错误修复

  • 修复了使用 popUpTo 中断导航并使用另一个导航将导致 FragmentNavigator 崩溃的问题。(I3c848b/301887045
  • 修复了系统返回按键导致 currentDestination 未正确更新以匹配显示的 Fragment 的问题。(Id0d6cb/289877514
  • DialogFragment 生命周期现在将在其上方的对话框被关闭时正确地移动到 RESUMED 状态。(I88f0db/301811387

版本 2.7.3

版本 2.7.3

2023年9月20日

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

错误修复

  • 修复了 Navigation with Fragments 中导致 visibleEntries 列表包含不正确条目的问题。(I5caa9b/288520638
  • 修复了导致浮动窗口目的地(即 DialogsBottomsheets 等)从不获取 RESUMED 生命周期回调的问题。(I3b866b/287505132

版本 2.7.2

版本 2.7.2

2023年9月6日

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

错误修复

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

依赖项更新

  • Navigation Compose 现在依赖于 Compose 1.5.1。

2.7.1 版本

2.7.1 版本

2023 年 8 月 23 日

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

错误修复

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

2.7.0 版本

2.7.0 版本

2023 年 8 月 9 日

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

自 2.6.0 版本以来的重要更改

Accompanist 的动画

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

这意味着 AnimatedNavHost 中存在的所有设置自定义转换的支持都直接在 NavHost 中得到支持。

Accompanist Navigation Animation 将不会进行其他更改,我们很快就会正式弃用它,并提供如何迁移回 Navigation Compose 本身的指南,但这将是 迁移指南 的反向操作,如果您已经使用最新的 Accompanist alpha(0.31.2-alpha),则无需进行其他 API 更改。(b/197140101

错误修复

  • Navigation Compose 中的 NavHost 现在可以正确拦截系统返回调用,即使在 Activity 已停止并恢复之后也是如此。(Icb6deb/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 顺序。(/Ib1c3ab/285153947

2.7.0-beta01 版本

2023 年 6 月 7 日

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

错误修复

  • NavHost in Navigation Compose 现在可以正确拦截系统返回调用,即使在 ActivitySTOPPEDRESUMED 之后也是如此。(Icb6deb/279118447

2.7.0-alpha01 版本

2023 年 5 月 24 日

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

Accompanist 的动画

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

这意味着 AnimatedNavHost 中存在的所有设置自定义转换的支持都直接在 NavHost 中得到支持。

Accompanist Navigation Animation 将不会进行其他更改,我们很快就会正式弃用它,并提供如何迁移回 Navigation Compose 本身的指南,但这将是 迁移指南 的反向操作,如果您已经使用最新的 Accompanist alpha(0.31.2-alpha),则无需进行其他 API 更改。(b/197140101

错误修复

  • 来自 Navigation 2.6.0-rc02:修复了 Fragments 中 Navigation 的一个问题:使用 popUpTo 导航并从返回堆栈中弹出片段而不重新创建其视图会导致系统返回停止工作。(Ieb8d4b/281726455

依赖项更新

  • Navigation 现在依赖于 Compose 1.5.0-beta01

2.6.0 版本

2.6.0 版本

2023 年 6 月 7 日

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

自 2.5.0 版本以来 Navigation 的重要更改

  • NavBackStackEntryarguments 和传递给 OnDestinationChangedListenerarguments 现在只是在您导航到目标位置时创建的不变参数的副本。这意味着对这些 Bundles 进行的任何更改都不会反映在随后对 arguments 或其他 OnDestinationChangedListener 实例的访问中。
  • NavDeepLink 现在支持数组的默认值,这允许支持将映射到参数数组类型的重复查询参数。NavType 现在还包括一个默认方法,可以重写该方法以组合两个解析的值。
  • NavType 的自定义子类现在可以重写 serializeAsValue 以将值序列化为字符串,从而允许在 NavType 类中完全封装序列化和反序列化(通过 parseValue)。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 设备上提供应用内预测返回动画。
  • 当使用 Navigation with Fragments 时,尝试手动执行将片段添加到 FragmentManager 返回堆栈的 FragmentTransaction 现在将抛出 IllegalArgumentException。您应始终通过 navigate() API 添加片段。
  • 当在导航 XML 文件的 activity 元素中使用精确字符串 ${applicationId} 作为 app:dataapp:dataPattern 属性中的占位符时,该占位符将在膨胀时自动填充上下文的 packageName
  • FragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用转换 API。这意味着 NavBackStackEntry Lifecycle 现在将在将它们的最终 Lifecycle.State 移动之前等待进入和退出片段特效完成。
  • DialogFragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用转换 API。这意味着 NavBackStackEntry Lifecycle 现在将在移动到 DESTROYED 之前等待 DialogFragment Lifecycle 移动到 DESTROYED
  • 现在,NavHostFragment 允许您在 NavHostFragment 附加到 FragmentManager 时立即检索 NavController,而不仅仅是在 onCreate()之后。
  • 导航对动态特性模块的支持现在依赖于细粒度的 Play 特性交付库。
  • 导航安全参数现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与 7.3.0+ 版本兼容。

自 2.5.0 版以来,NavigationUI 的重要更改

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

2.6.0-rc02 版本

2023 年 5 月 24 日

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

错误修复

  • 修复了片段中导航的一个问题,在该问题中,使用 popUpTo 进行导航并从返回栈中弹出片段而不重新创建其视图会导致系统返回停止工作。(Ieb8d4b/281726455

2.6.0-rc01 版本

2023 年 5 月 10 日

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

错误修复

  • 修复了片段中导航的一个问题,在该问题中,在 onResume() 生命周期回调中使用 popUpTo 通过导航移除片段会导致 IllegalStateException。(I21884b/279644470

2.6.0-beta01 版本

2023 年 4 月 19 日

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

新功能

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

错误修复

  • 当在片段中使用导航时,尝试手动执行将片段添加到 FragmentManager 返回栈的 FragmentTransaction 现在将抛出 IllegalArgumentException。您应该始终通过 navigate() API 添加片段。(I6d38e
  • 当同一帧中存在添加条目的 navigate 和移除它的 popBackStack 时,返回栈上的结果顶部条目现在将始终返回到 RESUMED Lifecycle.State。(Id8067b/276495952

2.6.0-alpha09 版本

2023 年 4 月 5 日

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

错误修复

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

2.6.0-alpha08 版本

2023 年 3 月 22 日

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

新功能

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

错误修复

  • 修复了弹出包含不可为空参数的嵌套图时发生的 NullPointerException。(6b3581b/249988437
  • 使用 popUpTo 进行导航后使用系统返回键时,NavController 的状态将弹出到正确的条目。(I3a8ecb/270447657
  • FragmentNavigator 现在将在通过系统返回键或 popBackStack() 弹出返回栈时正确弹出条目,无论事务是否对片段使用效果。(I81bdf
  • 不使用导航将片段添加到 FragmentNavigatorFragmentManager 将不再导致崩溃。(b17204b/274167493

依赖项更新

2.6.0-alpha07 版本

2023 年 3 月 8 日

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

错误修复

  • 现在,采用路由的 getBackStackEntrypopBackStackclearBackStack API 变体采用具有可空参数和可空查询参数的路由模式(I22294b/269302500
  • 修复了从 NavController 调用 clearBackStack() 不会清除与已清除返回栈关联的片段管理器中的保存状态的问题。(Ic1cceb/271190202
  • 修复了 2.6.0-alpha06 中的回归问题,该问题在标签之间使用系统返回键时会导致 BottomNavigationView 中突出显示错误的 MenuItem。(I634f6b/270447657
  • 修复了 2.6.0-alpha06 中的回归问题,该问题导致使用 AnimationNavBackStackEntry 未移动到 RESUMED 状态。(Ib3589b/269646882

2.6.0-alpha06 版本

2023 年 2 月 22 日

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

新功能

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

API 变更

  • 所有 NavController navigate 重载现在都用 @MainThread 进行了注释,以确保它们在主线程上调用。(I2c0b0b/263427111

错误修复

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

已知问题

  • 在片段中使用导航时,使用 Animation API 时,NavBackStackEntry 的生命周期无法达到 RESUMED。(b/269646882
  • 在片段中使用导航并使用 BottomNavigation 时,如果尝试恢复具有多个条目的返回栈,则 BottomMenuItem 未正确更新。(b/270447657
  • 在片段中使用导航后,恢复状态时,当片段被 DESTROYED 时,NavBackStackEntry Lifecycle 不会被 DESTROYED。(b/270610768

2.6.0-alpha05 版本

2023 年 2 月 8 日

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

新功能

  • NavController.popBackStack(route)NavController.getBackStackEntry(route)NavController.clearBackStack(route) 现在都支持参数部分或全部填充的路由。 请注意,参数必须与条目参数完全匹配。(Iebd28Ic678cI3b37bb/257514373
  • FragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用过渡 API。 这意味着 NavBackStackEntryLifecycle 现在将在进入和退出片段的特效完成后,才会将它们的最终 Lifecycle.State 变更。(I3cb19b/238686802
  • DialogFragmentNavigator 现在在导航和弹出 NavBackStackEntries 时使用过渡 API。 这意味着 NavBackStackEntryLifecycle 现在将在 DialogFragmentLifecycle 变为 DESTROYED 后,才会变为 DESTROYED。(I53ee5b/261213893

API 变更

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

错误修复

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

2.6.0-alpha04 版本

2022 年 11 月 9 日

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

新功能

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

错误修复

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

依赖项更新

  • 导航对动态特性模块的支持现在依赖于细粒度的 Play 功能交付库。(Ib4ddc
  • Navigation Safe Args 现在依赖于 Android Gradle 插件 7.3.0 版本。这意味着它现在仅与 7.3.0+ 版本兼容。(I47e49

2.6.0-alpha03 版本

2022 年 10 月 24 日

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

错误修复

  • 来自 Navigation 2.5.3:当没有可用于 Crossfade 合成的目标时,NavHost 将不再导致 NoSuchElementException。它现在只会跳过合成。(Ieb46eb/253299416
  • 来自 Navigation 2.5.3:修复了当目标从返回栈弹出时,保存的 Compose 状态(例如,rememberSaveable 的用法)未被遗忘和删除的问题。(I64949

依赖项更新

2.6.0-alpha02 版本

2022 年 10 月 5 日

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

行为更改

  • 当将导航图的 ID 传递给 AppBarConfiguration(例如,通过 Menu)时,NavigationUI 现在只将该导航图的起始目标视为顶级目标,而不是错误地将图中的每个目标都标记为顶级目标。传递单个目标 ID 的行为保持不变。此相同的功能可通过 AppBarConfiguration 上的新 isTopLevelDestination 函数提供给您自己的代码。(Ie936eb/238496771

错误修复

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

2.6.0-alpha01 版本

2022 年 9 月 7 日

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

新功能

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

API 变更

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

行为更改

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

错误修复

2.5 版本

2.5.3 版本

2022 年 10 月 24 日

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

错误修复

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

2.5.2 版本

2022 年 9 月 7 日

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

错误修复

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

依赖项更新

2.5.1 版本

2022 年 7 月 27 日

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

错误修复

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

依赖项更新

2.5.0 版本

2022 年 6 月 29 日

已发布 androidx.navigation:navigation-*:2.5.02.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-rc022.5.0-rc02 版本包含以下提交。

错误修复

  • 修复了使用 Navigation Compose NavHost 时,在底部目的地之间快速切换导致的崩溃。(I3979ab/234054916
  • 当使用 applicationIdSuffix 和 namespace 且没有 applicationIdapplicationId 和 namespace 不同时,Navigation SafeArgs 将不再崩溃。(I754b1b/233119646
  • NavArgument 现在具有自定义的 toString() 函数,用于显示参数的内部值。(I900a8

2.5.0-rc01 版本

2022 年 5 月 11 日

已发布 androidx.navigation:navigation-*:2.5.0-rc012.5.0-rc01 版本包含以下提交。

新功能

  • 添加了一个新的 lint 规则,用于警告在 navigation.xml 文件中将 <deeplink> 元素放在 <activity> 元素内的行为。(Ic15a5b/178403185

错误修复

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

2.5.0-beta01 版本

2022 年 4 月 20 日

已发布 androidx.navigation:navigation-*:2.5.0-beta012.5.0-beta01 版本包含以下提交。

错误修复

  • DialogNavigator 现在在执行 dismiss() 调用时使用 popWithTransition。这修复了在 dialog 目的地中使用 ViewModel 时发生的竞争条件,该竞争条件会在通过使用系统返回键或点击对话框外部退出来关闭对话框时导致 IllegalStateException。(Id7376b/226552301

依赖项更新

  • 导航现在依赖于 Lifecycle 2.5.0-beta01,修复了在使用多个返回栈时,在一个非主底部导航选项卡中将一个 NavHost 嵌套在另一个 NavHost 内导致的 IllegalStateException

2.5.0-alpha04 版本

2022 年 4 月 6 日

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

API 变更

错误修复

  • NavHost 现在依赖于来自 NavControllervisibleEntries 来确定要组合哪些条目。这意味着当使用嵌套 NavHost 时,内部 NavHost 现在应该能够正确地动画退出。(I4ba2bb/225394514
  • 现在,NavController 提供的 visibleEntries StateFlow 基于条目的最大生命周期状态,而不是当前生命周期状态。这意味着即使 navController 的主机生命周期低于 STARTED,可见条目的列表也将保持不变。(I9e2a8b/225394514
  • SavedStateViewFactory 现在支持即使使用 SavedStateRegistryOwner 初始化也可以使用 CreationExtras。如果提供了额外内容,则会忽略已初始化的参数。(I6c43bb/224844583
  • NavDeepLink 现在可以解析具有单个没有值的查询参数的 Uri。(I0efe8b/148905489
  • 空字符串现在被视为深度链接中的有效参数。(I70a0db/217399862
  • 当使用 namespace 且没有 AndroidManifest.xml 时,Navigation Safe Args 将不再崩溃。(I17ccfb/227229815

2.5.0-alpha03 版本

2022 年 2 月 23 日

已发布 androidx.navigation:navigation-*:2.5.0-alpha032.5.0-alpha03 版本包含以下提交。

API 变更

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

错误修复

  • NavDeepLinks 现在正确支持嵌入在路由/深度链接 URI 中的编码换行符。(I513d1b/217815060
  • 现在,当与 NavBackStackEntries 一起使用以创建 ViewModel 时,CreationExtras 将正常工作。(I69161b/217617710
  • Navigation Safe Args 现在支持使用 build.gradle 中定义的 namespace 来代替 AndroidManifest 中的包。(I659efb/217414933

2.5.0-alpha02 版本

2022 年 2 月 9 日

已发布 androidx.navigation:navigation-*:2.5.0-alpha022.5.0-alpha02 版本包含以下提交。

错误修复

  • 来自 Navigation 2.4.1:当使用 viewbinding 和嵌套图时,NavHostFragment 现在将正确设置 OnBackPressedDispatcher。(Ifbb51b/214577959
  • 导航 2.4.1 开始:通过多个嵌套的 NavGraph 进行深度链接时,返回栈现在将正确包含中间的起始目的地。(I504c0b/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 将不再不必要地对参数进行两次解码,这意味着现在将正确的参数传递到您的最终目的地。(I31b0ab/210711399

Safe Args

  • Safe Args 现在依赖于 Android Gradle Plugin 7.0.4 版本。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle Plugin 7.1.0 及更高版本兼容。(I41c88b/213086135b/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 版本包含这些提交。

错误修复

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

版本 2.4.0

版本 2.4.0

2022年1月26日

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

自 2.3.0 版本以来的重要更改

  • 所有 Navigation 工件都已使用 Kotlin 重写。这改进了使用泛型(例如 NavType 子类)的类的空值性。所有曾经是 -ktx 工件一部分的 Kotlin 扩展函数都已移动到它们各自的主工件中。-ktx 工件将继续发布,但它们是完全空的。
  • navigation-fragment 工件现在包含通过新的 AbstractListDetailFragment 预构建的 双面板布局 实现。此 Fragment 使用 SlidingPaneLayout 来管理列表面板(您的子类提供)和细节面板,细节面板使用 NavHostFragment 作为其实现,如我们的 示例实现 中所示。
  • NavController 上的 currentBackStackEntryAsFlow() 方法提供了一个 Flow,每当当前 NavBackStackEntry 更改时都会发出信号。此 flow 可用作手动管理 OnDestinationChangedListener 的替代方法。
  • NavController 现在可以通过实验性的 visibleEntries 属性提供一个 StateFlow 来检索所有可见 NavBackStackEntry 实例的列表。
  • 现在可以扩展 NavType 类来创建自定义 NavType。仅当以编程方式(例如通过 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() 方法。(#122b/136967621

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

导航路由和 Kotlin DSL

之前的 Navigation 版本依赖于每个目的地都有一个常量整型 ID,该 ID 将唯一地标识它与其同级目的地,并允许您直接或通过操作 navigate() 到该目的地。虽然这仍然有效且有用,尤其是在您在 XML 中定义导航图并可以使用自动生成的 R.id 常量或 Safe Args(它使用这些常量在构建时生成代码)的情况下,但这种唯一整数系统并未捕捉到通过 Navigation Kotlin DSL 以编程方式在运行时构建完全动态图所需语义含义和表达力。

此版本引入了一种新选项,用于通过其路由唯一标识导航图中的目的地。路由是定义目的地唯一路径的 String。所有采用目的地 ID 的 Kotlin DSL 方法现在都已弃用,并替换为采用路由的等效 API。

每个路由都应被视为定义该目的地的 Uri 的“路径”部分,例如 homeprofile/{userId}profile/{userId}/friends 等。当目的地的标识与特定内容相关联时,这些动态参数应作为路由的一部分,遵循与 隐式深度链接 相同的规则。

所有以前只采用 ID 的 NavController API 现在都有一个采用路由 String 的重载。这包括 navigate()popBackStack()popUpTo()getBackStackEntry()

这产生了一些 API 影响

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

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

Navigation Compose

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

此版本提供

  • 一个 NavHost 可组合项,允许您使用 Kotlin DSL 构造导航图,使用 composabledialog 目标,并支持可选的导航器,例如来自 Accompanist Navigation Material 的导航器。
  • 强制支持目标之间的交叉淡入淡出。可以使用 Accompanist Navigation Animation 来使用实验性的 Compose API 控制进入和退出过渡。
  • Lifecycle 的作用域限定为每个可组合目标。只有当任何进入过渡完成时,每个目标才会达到 RESUMED 状态,并且当任何退出过渡开始时,立即降至 STARTED 状态,因此您可以避免所有 IllegalStateException 和多点触控问题,只需在 LifecycleRESUMED 时触发 navigate 调用。
  • 在目标级别限定 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() 方法现在会自动保存和恢复弹出目标的状态,从而无需任何代码更改即可支持多个返回堆栈。使用带有 Fragment 的 Navigation 时,这是与多个返回堆栈集成的推荐方法。

保存和恢复状态的基础 API 通过多个层面公开

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

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

    // Use the navigate() method that takes a navOptions DSL Builder
    navController.navigate(selectedBottomNavRoute) {
      launchSingleTop = true
      restoreState = true
      popUpTo(navController.graph.findStartDestination().id) {
        saveState = true
      }
    }
    
  • 通过 NavOptions.Builder 手动构建 NavOptions 对象时,您可以使用 setRestoreState()setPopUpTo() 的新重载,该重载带有一个额外的 saveState 参数。

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

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

在所有情况下,NavController 都将保存和恢复每个 NavBackStackEntry 的状态,包括任何导航目标作用域的 ViewModel 实例。Navigator API 已更新,以使每个 Navigator 都能支持保存和恢复其自身的状态。

行为变更

  • NavDeepLinkBuilder 现在将 PendingIntent.FLAG_IMMUTABLE 添加到 createPendingIntent() 返回的 PendingIntent,确保此 API 在面向 Android 12 时按预期工作。
  • 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 解析的参数现在将井号与问号一样视为参数之间的分隔符。(I21309b/180042703

错误修复

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

Navigation Compose 错误修复

  • 修复了使用底部导航菜单项在起始目标和其他目标之间快速切换可能导致的崩溃问题。(Ic8976b/208887901
  • 对话框目标现在在配置更改或进程死亡后正确地恢复到屏幕顶部。(I4c0dcb/207386169
  • 修复了当对话框被关闭时,尝试从对话框的 NavBackStackEntry 中检索 ViewModel 将失败的问题。(I6b96db/206465487
  • 修复了在 Navigation Compose 的 NavHost 中使用 activity 目标时会导致无限重组的问题。(I8f64c
  • 修复了 Navigation Compose 中的一个内存泄漏问题,该问题在配置更改或进程死亡后仍持有旧 Activity 的引用。(I4efcbb/204905432)

Safe Args 错误修复

  • 进程死亡后,SafeArgs 在尝试恢复自定义 Parcelable 数组时不再崩溃。(I618e8b/207315994)
  • 修复了 Safe Args 中的一个错误,该错误不允许布尔型数组具有 null 值。(I8c396b/174787525)

2.4.0-beta02 版本

2021 年 11 月 3 日

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

API 变更

  • 现在,显式和隐式深层链接的处理在导航到另一个图时会自动添加 saveState 标志,确保诸如 NavigationUI.setupWithNavController 和使用多个回退栈的代码按预期工作。(Ic8807)

行为更改

  • 现在,深层链接模式在 NavDeepLink 中延迟编译,而不是在膨胀期间编译。这应该会提高包含深层链接的导航图的膨胀时间。(b8d257b/184149935)

错误修复

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

2.4.0-beta01 版本

2021 年 10 月 27 日

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

新功能

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

API 变更

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

错误修复

  • 当通过在相同屏幕之间来回导航中断转换时,ViewModel 将不再被销毁 (Id52d8b/200817333)
  • 可空 NavDeepLink 参数在将深层链接添加到 NavDestination 时不再需要默认值。(I5aad4b/201320030)
  • 具有不同生命周期的 NavBackStackEntries 不再被视为相等。这意味着 NavHost 在使用 singleTop 进行导航以及重新选择底部菜单项时将正确地重新组合所有目的地。(I1b351b/196997433)
  • 修复了 AbstractListDetailFragment 中导致 onCreateListPaneView() 返回的列表窗格上的 layout_widthlayout_weight 属性处理不正确或被忽略的问题。(f5fbf3)
  • 对话框目的地的视觉状态现在与 DialogFragmentNavigator 的状态正确同步。这意味着手动调用 DialogFragment 的异步 dismiss() API 现在会正确清除已关闭对话框上方的所有对话框目的地。这不会影响您使用 popUpTopopBackStack() 关闭对话框的情况。(I77ba2)
  • AbstractAppBarOnDestinationChangedListener 现在对 onDestinationChanged() 具有更清晰的错误消息。(Ie742d)

2.4.0-alpha10 版本

2021 年 9 月 29 日

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

新功能

  • NavController 现在提供了通过 visibleEntries StateFlow 获取所有可见 NavBackStackEntry 实例列表的功能 (Ia964e)
  • rememberNavController() 现在接受一组可选的 Navigator 实例,这些实例将添加到返回的 NavController 中,以便更好地支持可选的 Navigator,例如来自 Accompanist Navigation Material 的那些 Navigator。(I4619e)

错误修复

  • Activity 重新创建时,动态导航将不再崩溃。(Ifa6a3b/197942869)
  • 修复了系统后退按钮的一个问题,该问题仅在返回到包含 NavHost 的可组合目的地后才会发生。(3ed148b/195668143)
  • SafeArgs 现在按正确的参数顺序生成 fromBundle()fromSavedStateHandle() 的参数。(I824a8b/200059831)

2.4.0-alpha09 版本

2021 年 9 月 15 日

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

新功能

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

API 变更

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

行为更改

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

错误修复

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

依赖项更新

2.4.0-alpha08 版本

2021 年 9 月 1 日

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

新功能

行为更改

  • 生成操作时,现在从 Safe Args 生成的 Kotlin 代码将参数按无默认值的参数在前,有默认值的参数在后的顺序排列。(Idb697b/188855904
  • 深度链接现在会验证所有必需参数(那些没有默认值的参数)是否都存在于 Uri 中。(#204b/185527157

错误修复

  • 在可组合函数 `composable()` 内使用 getBackStackEntrypreviousBackStackEntry 并结合 remember(),将不再因为回退栈中没有目标而导致异常。(I75138b/194313238
  • 更改回退栈参数并使用 launchSingleTop=true 时,Navigation Compose 现在可以正确地重新组合。(Iebd69b/186392337
  • 使用包含 13 个或 29 个目标的图表调用 setGraph 时,将不再出现 ArrayIndexOutOfBoundsException。(I1a9f1b/195171984
  • SafeArgs Java 生成器在生成 Args 类时,将不再导致 lint 警告。(I1a666b/185843837

外部贡献

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

2.4.0-alpha07 版本

2021 年 8 月 18 日

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

错误修复

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

2.4.0-alpha06 版本

2021 年 8 月 4 日

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

API 变更

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

行为更改

  • 使用动画(如 Crossfade)导航时,新目标的 Lifecycle 现在只有在动画完成时才会到达 RESUMED 状态。(If0543b/172112072b/194301889
  • Navigation Compose 的 NavHost 现在会在第一次组合时设置图表。(Ieb7be

错误修复

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

2.4.0-alpha05 版本

2021 年 7 月 21 日

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

行为更改

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

错误修复

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

2.4.0-alpha04 版本

2021 年 7 月 1 日

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

新功能

  • navigation-fragment 模块现在通过新的 AbstractListDetailFragment 包含预构建的 双面板布局 实现。此片段使用 SlidingPaneLayout 来管理列表面板(您的子类提供)和详细信息面板,详细信息面板使用 NavHostFragment 作为其实现,如我们的 示例实现 中所示。(Iac4beb/191276636
  • navigation-compose 模块的 NavHost 现在除了支持 composable 目标外,还支持 dialog 目标。这些对话框目标将分别显示在可组合的 Dialog 中,浮在当前 composable 目标之上。(I011d0
val navController = rememberNavController()
    Scaffold { innerPadding ->
        NavHost(navController, "home", Modifier.padding(innerPadding)) {
            composable("home") {
                // This content fills the area provided to the NavHost
                HomeScreen()
            }
            dialog("detail_dialog") {
                // This content will be automatically added to a Dialog() composable
                // and appear above the HomeScreen or other composable destinations
                DetailDialogContent()
            }
        }
    }

API 变更

  • NavigatorState 中的 add 函数已重命名为 push。所有当前对 add() 的调用都需要更改为 push()。(Ie89fcb/172112072
  • 自定义 Navigator 实例现在可以使用 NavigatorState 上的 pushWithTransactionpopWithTransition API 来异步推送或弹出目标。请注意,这些 API 尚未被任何包含的导航器使用。(Ic4d7cb/172112072

行为更改

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

错误修复

  • 修复了 <include-dynamic> 的问题,其中传递给图表的参数不会正确传递给动态包含的图表。(I3e115
  • 修复了使用默认值为 @nullstring[] 参数导航到目标时发生的 NullPointerException。(I1fbe8
  • @Navigator.Name 添加 ProGuard 规则,修复使用 R8 3.1 完全模式时出现的问题。(I2add9b/191654433
  • 使用低于1.5.0版本的Kotlin构建应用时,SafeArgs将不再失败。(Icd1ffb/190739257)

2.4.0-alpha03 版本

2021年6月16日

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

错误修复

  • 修复了一个问题:导航到包含的动态图需要调用两次navigate()。(I7785cb/188859835)
  • 修复了Navigation 2.4.0-alpha01中引入的回归问题:当您位于顶级目的地时,setupActionBarWithNavController()不会正确移除向上图标。(I5d443b/189868637)
  • 修复了在先前弹出NavController的根图后调用popBackStack()时发生的IllegalStateException。(I2a330b/190265699)
  • 使用navigation-common或任何依赖它的构件时,by navArgs()的ProGuard规则现在可以正确应用。(I68800b/190082521)
  • 第一次收到回调时调用navigate()OnDestinationChangedListener现在可以正确地获得第二个回调,并带有其导航到的目标。(Ie5f9eb/190228815)
  • 使用动态特性模块和AGP 7.0+时,Safe Args不再崩溃。(I69518b/189966576)

已知问题

  • 由于依赖于较旧版本的Kotlin,使用Gradle 6.7.0时,Safe Args将出现Unable to find method ‘’java.lang.String kotlin.text.CarsKt.titleCase(char, java.util.Locale)’’错误。可以通过更新到Gradle 7.0来解决此问题。(b/190739257)

2.4.0-alpha02 版本

2021年6月2日

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

新功能

  • 现在支持Activity、Fragment和Dialog目标的路由,以及整个DynamicNavigation Kotlin DSL。(Ib5544Ia617bI22f96b/188914648b/188901565)
  • NavigationUI暂时添加了实验性API,允许选择退出保存状态。虽然始终保存状态是正确的行为,但仍然存在一些已弃用的库(例如保留的片段),在保存状态时无法支持它们,因此这为应用提供了逐步转换任何不受支持的API的机会。(Idf93c)
  • Navigation现在提供findDestination()getHierarchy() API,可用于帮助实现自定义NavigationUI。findDestination()NavGraph上的扩展函数,它将在图中找到一个目标。getHierarchy()NavDestination上的函数,可用于验证给定目标是否位于另一个目标的层次结构中。(I2932fb/188183365)

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

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

API 变更

错误修复

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

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

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

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

依赖项更新

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

2.4.0-alpha01 版本

2021年5月18日

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

新功能

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

多个返回堆栈

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

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

保存和恢复状态的基础 API 通过多个层面公开

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

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

    // Use the navigate() method that takes a navOptions DSL Builder
    navController.navigate(selectedBottomNavRoute) {
      launchSingleTop = true
      restoreState = true
      popUpTo(navController.graph.startDestinationId) {
        saveState = true
      }
    }
    
  • 通过 NavOptions.Builder 手动构建 NavOptions 对象时,您可以使用 setRestoreState()setPopUpTo() 的新重载,该重载带有一个额外的 saveState 参数。

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

在所有情况下,NavController都将保存和恢复每个NavBackStackEntry的状态,包括任何导航目标范围内的ViewModel实例。Navigator API已更新,以使每个Navigator都能支持保存和恢复其自身的状态。

用于Navigation Compose中composable目标的ComposeNavigator以及用于Navigation with Fragments中<fragment>目标的FragmentNavigatorDynamicFragmentNavigator都已更新为使用新的Navigator API并支持保存和恢复状态。

导航路由

**路由**是唯一标识目标的String。虽然以前仅在Navigation Compose中使用,但此概念现在已成为核心Navigation API的一部分。这在通过Navigation Kotlin DSL构建图时,提供了一种替代使用整数ID的方法。(b/172823546)

所有以前只接受ID的API现在都有一个接受路由String的重载。这包括navigate()popBackStack()popUpTo()getBackStackEntry()

这产生了一些 API 影响

  • Kotlin DSL上的popUpTo kotlin 属性已被弃用,应替换为popUpToId。(I59c73b/172823546)
  • getStartDestination() API已被弃用,应替换为getStartDestinationId()。(I0887fb/172823546)

对于从早期版本的Navigation Compose升级到Navigation Compose 2.4.0-alpha01的开发者,这意味着不再需要以下扩展方法的导入,应将其删除。

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

KEY_ROUTE参数已被NavDestination上的route属性替换,允许您直接调用navBackStackEntry.destination.route

API 变更

  • 所有Navigation构件都已使用Kotlin重写。这改进了使用泛型(例如NavType子类)的类的空值性。所有以前是-ktx构件一部分的Kotlin扩展函数都已移动到各自的主构件中。-ktx构件将继续发布,但完全为空。(b/184292145)
  • NavDeepLinkBuilder现在支持将多个不同的目标添加到生成的回退堆栈。(I3ee0db/147913689)
  • DynamicNavHostFragment添加工厂函数(Icd515b/175222619)
  • NavBackStackEntry的唯一ID现在作为其公共API的一部分公开。(Ie033a)
  • 现在,NamedNavArgumentnameargument 字段以及解构函数已公开。(#174b/181320559
  • 引入了一个新的 NavBackStackEntry#provideToCompositionLocals 扩展函数,它可以将 NavBackStackEntry 提供给相关的组合局部变量。(#175b/187229439

Safe Args

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

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

行为更改

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

Compose 兼容性

  • androidx.navigation:navigation-compose:2.4.0-alpha01 只兼容 Compose 版本 1.0.0-beta07 及以上版本。

错误修复

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

外部贡献

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

版本 1.0.0-alpha10

2021年4月7日

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

API 变更

  • NavHost 现在接受一个 Modifier,该 Modifier 将传递到包装目标组合组件的组合容器。(I85acab/175125483

错误修复

  • 即使找不到 OnBackPressedDispatcherOwnerNavHost 现在也能正常工作,例如预览 NavHost 时。(I7d8b4
  • Navigation Compose 现在依赖于 Navigation 2.3.5,修复了在 NavHost 目标内使用 BackHandler 时出现的问题。(I7e63bb/182284739

版本 1.0.0-alpha09

2021年3月10日

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

API 变更

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

错误修复

  • Navigation Compose 现在依赖于 Navigation 2.3.4,其中包含针对在设置图表后尝试设置相同的 ViewModelStore 对象的修复。(I65c24b/177825470

版本 1.0.0-alpha08

2021年2月24日

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

新功能

  • NavHost 现在使用该目标的 NavBackStackEntry 来填充 LocalSavedStateRegistryOwner CompositionLocal,确保直接保存到 SavedStateRegistry 的任何状态都将与目标一起保存和恢复。(I435d7b/179469431

版本 1.0.0-alpha07

2021年2月10日

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

依赖项更新

版本 1.0.0-alpha06

2021年1月28日

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

API 变更

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

版本 1.0.0-alpha05

2021年1月13日

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

更新为依赖 Compose 1.0.0-alpha10。

版本 1.0.0-alpha04

2020年12月16日

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

  • 更新为兼容 Compose 1.0.0-alpha09

版本 1.0.0-alpha03

2020年12月2日

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

错误修复

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

1.0.0-alpha02 版本

2020年11月11日

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

API 变更

  • Navigation Compose 现在支持 NavOptions 用于 popUpTo 和 launchSingleTop 操作(If96c3b/171468994)
  • 添加了一个导航函数,该函数使用路由而不是 ID,允许您在 Navigation Compose DSL 中构建嵌套图。(I1661d)
  • startDestination 现在位于 NavHost 参数列表中路由的前面(Ie620e)
  • 您现在可以使用路由作为起始目标在 NavHost 可组合项之外创建图。(Iceb75)

1.0.0-alpha01 版本

2020年10月28日

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

新功能

navigation-compose 工件提供了 Navigation 组件Jetpack 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 从参数获取意图来访问结果目标中的 Uri、操作和 MIME 类型,这与已用于外部深度链接的功能相呼应。(I975c3b/181521877)

错误修复

  • OnBackPressedCallbacks 已添加到调度器中,其中 NavBackStackEntry 作为 LifecycleOwner,现在可以在 Activity 生命周期为 STOPPED,然后为 STARTED 后正确拦截返回。(Iff94fb/182284739)
  • 深度链接域名解析现在不区分大小写,确保 www.example.com 同时匹配 www.example.comwww.Example.com。请注意,查询参数名称仍然区分大小写。(#144b/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 为前缀的十六进制值。(#127b/179166693)
  • 具有 app:argType="float" 的参数的 android:defaultValue 现在支持整数默认值,允许您使用 android:defaultValue="0" 而不是需要使用 0.0。(#117b/173766247)

错误修复

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

外部贡献

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

2.3.3 版本

2.3.3 版本

2021年1月27日

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

错误修复

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

2.3.2 版本

2.3.2 版本

2020年12月2日

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

错误修复

  • 修复了 NavigationUI 中的回归问题,其中使用具有 onNavDestinationSelected<activity> 目标将无法导航到 Activity。(I22e34b/171364502)
  • 修复了 navigation-dynamic-features-fragment 将导致多次导航到新安装的目标的问题。(aosp/1486056b/169636207)
  • 修复了使用 launchSingleTop 时默认参数不会发送到 OnDestinationChangedListener 实例的问题。(I2c5cb)
  • 修复了导航到嵌套导航图不会在返回堆栈上创建新的图实例的问题。(Ifc831)
  • 修复了使用 navigate() 和删除导航图中最后一个目标的 popUpTo 不会立即销毁并将导航图本身从返回堆栈中删除的问题。(I910a3)
  • Navigation SafeArgs 现在使用 KotlinPoet 1.7.2 版本,该版本增加了对 Kotlin 显式 API 模式的支持。(I918b5)
  • 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,建议使用它而不是默认动画资源。(b/167430145)
  • NavOptions 现在覆盖了 hashcode 和 equals 方法(b/161586466)
  • Navigation 现在在“没有 ID 的目标”IllegalArgumentException 中包含当前目标,这应该可以改善开发人员的调试体验。(b/168311416)

错误修复

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

依赖项更改

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

2.3.0 版本

2.3.0 版本

2020年6月24日

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

自 2.2.0 版本以来的主要更改

  • 特性模块集成navigation-dynamic-features-runtimenavigation-dynamic-features-fragment 工件允许您导航到特性模块中定义的目标位置,并根据需要自动处理特性模块的安装。有关详细信息,请参阅 使用特性模块进行导航
  • 导航测试navigation-testing 工件提供了一个 TestNavHostController,允许您设置当前目标位置并在导航操作后验证回退栈。有关详细信息,请参阅 测试导航
  • 返回结果:现在,导航回退栈上每个目标位置关联的 NavBackStackEntry 允许您访问 SavedStateHandle,该对象适用于存储应与特定回退栈条目关联的小量保存状态。有关详细信息,请参阅 向之前的目标位置返回结果
  • NavigationUIOpenable 的支持NavigationUI 中所有 DrawerLayout 的用法均已替换为在 CustomView 1.1.0 中添加的更通用的 Openable 接口(DrawerLayoutDrawerLayout 1.1.0 中实现)。
  • 深度链接中的操作和 MIME 类型支持:深度链接已扩展为支持 app:actionapp:mimeType,以及以前可用的 app:uriNavController 现在通过新的 NavDeepLinkRequest 类支持通过任何这些字段的组合进行导航。有关详细信息,请参阅 使用 NavDeepLinkRequest 进行导航

已知问题

  • 深度链接操作和 MIME 类型支持尚不可用于 清单合并器。在完成这项工作之前,清单中从 <nav-graph> 元素生成的任何 <intent-filter> 元素都不会在其 <data> 元素中包含您的 MIME 类型或您的自定义 <action>。您必须手动将相应的 <intent-filter> 添加到您的清单中。

2.3.0-rc01 版本

2020年6月10日

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

错误修复

  • 修复了当使用 singleTop 将没有参数的目标位置实例替换为有参数的另一个实例时出现的 NullPointerException。(b/158006669)
  • NavController 引发的所有 destination is unknown 异常现在都包含其他调试信息,以帮助确定 NavController 的状态。(b/157764916)

2.3.0-beta01 版本

2020年5月20日

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

错误修复

  • 修复了在进程死亡后 NavBackStackEntryLifecycle 未正确更新的问题。(b/155218371)
  • 在调用 setGraph() 之前注册的 OnDestinationChangedListener 实例现在会在进程死亡后正确接收已恢复的目标位置。(b/155218371)
  • 使用 singleTop 时,NavBackStackEntry 现在会正确更新其参数,并且更新后的参数会发送给所有 OnDestinationChangeListener 实例。(b/156545508)

依赖项更新

2.3.0-alpha06 版本

2020年4月29日

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

新功能

  • 深度链接已扩展为支持 app:actionapp:mimeType,以及以前可用的 app:uri。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,系统会通过在点后添加 moduleName 后缀到 applicationId 来使用默认值。如果您确实需要自定义 graphPackage,现在支持 ${applicationId} 占位符。(b/152696768)
  • Navigation Graph Kotlin DSL 现在为操作公开了一个 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 类不再使用构建器模式,现在可以直接构造。(aosp/1253671)
  • DynamicActivityNavigator 现在在其构造函数中采用 Context 而不是 Activity。(aosp/1250252)

错误修复

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

依赖项更新

  • Navigation 动态特性工件现在依赖于 Play Core 1.6.5。(b/149556401)

2.3.0-alpha03 版本

2020年3月4日

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

API 变更

错误修复

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

依赖项更改

  • Navigation 已恢复其对 Core 1.2.0 的依赖关系,现在依赖于 Core 1.1.0,以避免在 Navigation 不依赖于 Core 1.2.0 中的任何新 API 时强制开发人员迁移到较新的依赖项。

2.3.0-alpha02 版本

2020年2月19日

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

新功能

  • NavBackStackEntry 现在允许您访问 SavedStateHandle,该对象适用于存储应与特定回退栈条目关联的小量保存状态。有关示例用例,请参阅 返回结果。(b/79672220)

API 变更

  • 新增了getCurrentBackStackEntry()getPreviousBackStackEntry()便捷方法,以便更轻松地检索当前和上一个目的地的NavBackStackEntry。(b/79672220

错误修复

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

依赖项更改

版本 2.3.0-alpha01

2020年2月5日

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

新功能

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

错误修复

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

依赖项更新

版本 2.2.2

版本 2.2.2

2020年4月15日

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

错误修复

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

依赖项更新

版本 2.2.1

版本 2.2.1

2020年2月5日

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

错误修复

  • 不带查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随{argument}元素或不匹配深层链接。(b/147447512
  • navigation-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提供了一个导航驱动的LifecycleOwnerViewModelStoreOwner(与NavController.getViewModelStoreOwner()返回的相同)和SavedStateRegistryOwner,此外还提供了用于启动该目的地的参数。
  • **Lifecycle ViewModel SavedState 集成**: 使用by navGraphViewModels()或使用NavController.getBackStackEntry()NavController.getViewModelStoreOwner()返回的ViewModelStoreOwnerViewModelProvider构造函数时,SavedStateViewModelFactory现在是使用的默认工厂。
  • **对深层链接的查询参数支持**: 具有查询参数的深层链接现在支持重新排序的查询参数;当匹配深层链接时,具有默认值或可为空的参数现在是可选的。
  • **改进的动画支持**: NavHostFragment现在使用来自Fragment 1.2.0FragmentContainerView,修复了动画z轴顺序问题以及窗口内嵌内容分发到Fragment的问题。

版本 2.2.0-rc04

2019年12月18日

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

错误修复

版本 2.2.0-rc03

2019年12月4日

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

错误修复

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

依赖项更改

  • 导航现在在适当情况下依赖于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 包含这些提交

依赖项更改

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

版本 2.2.0-rc01

2019年10月23日

已发布androidx.navigation:navigation-*:2.2.0-rc01,自2.2.0-beta01以来没有更改。版本 2.2.0-rc01 包含这些提交

版本 2.2.0-beta01

2019年10月9日

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

新功能

  • NavDestination及其子类现在重写了toString(),以便在调试时提供更有用的信息。(b/141264986

行为变更

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

错误修复

  • 修复了如果也指定了查询参数,则会忽略深层链接路径中的参数的问题。(b/141505755
  • Activity上的navArgs() Kotlin 扩展现在在没有额外内容时具有更好的错误消息。(b/141408999
  • Safe Args 生成的Directions Java 类现在包含默认值。(b/141099045
  • Safe Args 生成的Args Java 类现在包含默认值。(b/140123727
  • 使用Toolbar时,NavigationUI在顶级目的地之间移动时不再动画化文本更改。(b/140848160

版本 2.2.0-alpha03

2019年9月18日

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

行为变更

  • 调用setGraph后调用setViewModelStore()现在会导致IllegalStateException。这应该始终由NavHost作为初始设置的一部分进行设置,以确保所有NavBackStackEntry实例都具有ViewModel实例的一致存储。(aosp/1111821

错误修复

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

版本 2.2.0-alpha02

2019年9月5日

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

新功能

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

错误修复

  • 修复了将 NavHostFragment 添加到 ViewPager2 时出现 IllegalArgumentException 的问题。(b/133640271)
  • NavInflater 现在避免不必要地调用 getResourceName(),从而将加载时间加快了多达 40%。(b/139213740)

版本 2.2.0-alpha01

2019 年 8 月 7 日

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

新功能

  • 使用 by navGraphViewModels() 或使用 ViewModelStoreOwner(由 NavController.getViewModelStoreOwner() 返回)和 ViewModelProvider 构造函数时,SavedStateViewModelFactory 现在是默认使用的工厂。(b/135716331)

API 变更

错误修复

  • NavHostFragment 现在使用 FragmentContainerView,修复了动画 z 顺序问题以及窗口内边距分派到片段的问题。(b/137310379)

版本 2.1.0

版本 2.1.0

2019年9月5日

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

自 2.0.0 版本以来的重要更改

  • 将 ViewModel 的范围限定为导航图:现在,您可以使用 Kotlin 用户使用的 -ktx 库中的 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 已发布。此版本中包含的提交可以在这里找到 这里

错误修复

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

版本 2.1.0-beta01

2019 年 7 月 17 日

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

新功能

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

错误修复

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

版本 2.1.0-alpha06

2019 年 7 月 2 日

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

新功能

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

API 变更

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

行为变更

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

错误修复

  • 处理深层链接时,Navigation 现在会抑制处理活动重新创建时出现的动画,从而修复了视觉闪烁问题。(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)

错误修复

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

版本 2.1.0-alpha04

2019 年 5 月 16 日

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

错误修复

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

版本 2.1.0-alpha03

2019 年 5 月 7 日

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

已知问题

  • 即使使用 app:defaultNavHost="false",NavHostFragment 也会继续拦截系统后退按钮 b/132077777

新功能

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

行为变更

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

API 变更

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

错误修复

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

2.1.0-alpha02 版本

2019 年 4 月 3 日

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

新功能

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

API 变更

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

错误修复

  • 不再在加载时将 <activity> 目标的 android:name 解析为类,从而防止在使用动态功能时出现 ClassNotFoundException。b/124538597

2.1.0-alpha01 版本

2019 年 3 月 19 日

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

依赖项更改

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

API 变更

  • 已添加一个新的 Navigation.createNavigateOnClickListener(NavDirections) 方法,作为使用资源 ID 和 Bundle 创建点击监听器的替代方法。b/127631752
  • FragmentNavigator.instantiateFragment 现在已弃用。默认实现现在使用 FragmentFactory 来实例化 Fragment。b/119054429

错误修复

  • 当目标附加参数时,Navigation 不再发送空 Bundle,修复了使用 android:defaultValue="@null" 时的错误。b/128531879
  • Safe Args 现在依赖于 KotlinPoet 1.1.0,修复了极长包名的问题。b/123654948

2.0.0 版本

2.0.0 版本

2019 年 3 月 14 日

Navigation 2.0.0 已发布,与 2.0.0-rc02 没有区别。

2.0.0-rc02 版本

2019 年 3 月 6 日

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

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

您的项目必须已迁移到 AndroidX才能使用 2.X 版本的 Navigation。Navigation 1.0 稳定版将是使用 Support Library 依赖项的最后一个版本;1.0 之后的未来所有开发都将基于 AndroidX 并基于 2.0 稳定版构建。

AndroidX 之前的依赖项

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

dependencies {
    def nav_version = "1.0.0"

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

对于 Safe args,请在您的顶级 build.gradle 文件中添加以下 **classpath**

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

1.0.0 版本

1.0.0 版本

2019 年 3 月 14 日

Navigation 1.0.0 已发布,与 1.0.0-rc02 没有区别。

1.0.0-rc02 版本

2019 年 2 月 26 日

这是 Navigation 1.0.0 稳定版本的第二个候选版本。此版本包含许多错误修复。

错误修复

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

1.0.0-rc01 版本

2019 年 2 月 21 日

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

错误修复

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

1.0.0-beta02 版本

2019 年 2 月 12 日

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

新功能

  • 您现在可以使用 0 作为 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 的 reference 默认值使用将导致在解析导航 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 生成的代码现在可以正确处理使用指向静态内部类的 app:argType,格式为 .OuterClass$InnerClassb/123736741
  • Safe Args 生成的 Java 代码现在可以正确处理全局操作和深度嵌套的目标。b/123347762

1.0.0-alpha11 版本

2019 年 1 月 23 日

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

错误修复

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

版本 1.0.0-alpha10

2019 年 1 月 23 日

已知问题

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

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

新功能

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

行为更改

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

重大变更

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

错误修复

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

版本 1.0.0-alpha09

2018年12月18日

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

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

新功能

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

重大变更

  • 当使用具有 argType="reference"<argument> 时,Navigation 不再解析引用,而是提供原始资源 ID 本身。b/111736515
  • onNavDestinationSelected() 现在默认情况下会返回到导航图的起始目标,使其与 setup 方法保持一致。将 menuCategory="secondary" 添加到您的 MenuItem 以避免弹出返回栈。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 方法一起使用时,现在将自动替换 {argName} 实例在您的 android:label 中的正确参数 b/80267266
  • Navigation 现在依赖于 Support Library 28.0.0 b/120293333

重大变更

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

错误修复

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

Safe Args

  • Safe Args 支持 Serializable 对象,包括 Enum 值。Enum 类型可以通过使用枚举文字而不使用类名来设置默认值(例如 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 artifact 现在依赖于 Kotlin 标准库。API 已更改为与 Kotlin 约定更一致,但您仍可以将其用于用 Java 编写的测试。
  • 不再支持在清单中注册的元数据导航图。b/118355937
  • 操作不再可以附加到<activity> 目标。aosp/785539

错误修复

  • 深度链接现在可以正确解析查询参数。b/110057514
  • Activity 目标现在可以正确应用所有进入和退出动画。b/117145284
  • 修复了在使用自定义导航器时配置更改后发生的崩溃问题。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 保存状态后的导航操作,避免“onSaveInstanceState 后无法执行此操作”异常 b/110987825

Safe Args

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

错误修复

  • 修复了在 Fragment 生命周期方法期间导航时出现的问题 b/109916080
  • 修复了多次通过嵌套图导航时出现的问题 b/110178671
  • 修复了使用 setPopUpTo 和图中的第一个目标时出现的问题 b/109909461
  • 修复了所有 app:defaultValue 值都作为字符串传递的问题 b/110710788
  • Android Gradle 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

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

错误修复

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

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

  • 修复了使用 defaultNavHost="true" 作为子 Fragment 时发生的 IllegalArgumentExceptionb/79656847

  • 修复了使用 NavDeepLinkBuilder 时发生的 StackOverflowErrorb/109653065

  • 修复了导航回嵌套图时发生的 IllegalArgumentExceptionb/80453447

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

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

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

API 变更

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

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

1.0.0-alpha01 版本

2018年5月8日

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