导航
最新更新 | 稳定版本 | 发布候选版本 | Beta 版本 | Alpha 版本 |
---|---|---|---|---|
2024 年 9 月 4 日 | 2.8.0 | - | - | - |
声明依赖项
要添加对导航的依赖项,您必须将 Google Maven 存储库添加到您的项目中。阅读 Google 的 Maven 存储库 以了解更多信息。
在您的应用或模块的 build.gradle
文件中添加您需要的工件的依赖项
Groovy
dependencies { def nav_version = "2.8.0" // Jetpack Compose Integration implementation "androidx.navigation:navigation-compose:$nav_version" // Views/Fragments Integration implementation "androidx.navigation:navigation-fragment:$nav_version" implementation "androidx.navigation:navigation-ui:$nav_version" // Feature module support for Fragments implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version" // Testing Navigation androidTestImplementation "androidx.navigation:navigation-testing:$nav_version" }
Kotlin
dependencies { val nav_version = "2.8.0" // Jetpack Compose integration implementation("androidx.navigation:navigation-compose:$nav_version") // Views/Fragments integration implementation("androidx.navigation:navigation-fragment:$nav_version") implementation("androidx.navigation:navigation-ui:$nav_version") // Feature module support for Fragments implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version") // Testing Navigation androidTestImplementation("androidx.navigation:navigation-testing:$nav_version") }
安全参数
要将 安全参数 添加到您的项目,请在您的顶级 build.gradle
文件中包含以下 classpath
Groovy
buildscript { repositories { google() } dependencies { def nav_version = "2.8.0" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }
Kotlin
buildscript { repositories { google() } dependencies { val nav_version = "2.8.0" classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version") } }
您还必须应用两种可用的插件之一。
要生成适合 Java 或混合 Java 和 Kotlin 模块的 Java 语言代码,请将此行添加到您的应用或模块的 build.gradle
文件中
Groovy
plugins { id 'androidx.navigation.safeargs' }
Kotlin
plugins { id("androidx.navigation.safeargs") }
或者,要生成适合 Kotlin 仅模块的 Kotlin 代码,请添加
Groovy
plugins { id 'androidx.navigation.safeargs.kotlin' }
Kotlin
plugins { id("androidx.navigation.safeargs.kotlin") }
您必须在您的 gradle.properties
文件 中具有 android.useAndroidX=true
,如 迁移到 AndroidX 所述。
有关使用 Kotlin 扩展的信息,请参阅 ktx 文档。
有关依赖项的更多信息,请参阅 添加构建依赖项。
反馈
您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请查看此库中 现有问题。您可以通过单击星形按钮为现有问题添加您的投票。
有关更多信息,请参阅 问题跟踪器文档。
版本 2.8
版本 2.8.0
2024 年 9 月 4 日
androidx.navigation:navigation-*:2.8.0
已发布。版本 2.8.0 包含 这些提交。
自 2.7.0 以来的重要更改
导航 Kotlin DSL 类型安全
- 导航现在通过 Kotlin 序列化为 Kotlin DSL(由 Navigation Compose 使用)提供类型安全,允许您通过类型安全的对象和数据类在导航图中定义目的地
// Define a home destination that doesn't take any arguments
@Serializable
object Home
// Define a profile destination that takes an ID
@Serializable
data class Profile(val id: String)
// Now define your NavHost using type safe objects
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile)
}
}
有关更多信息,请参阅 Navigation Compose meet Type Safety 博客文章。
Navigation Compose 预测性返回
- 导航 Compose 现在通过 compose-animation 中的新
SeekableTransitionState
API 提供对预测性应用内后退的支持。这允许您使用后退手势在决定是否通过完成的手势提交事务或取消之前,使用自定义过渡查看上一个目的地。
导航片段可组合
- 添加了一个新的
navigation-fragment-compose
工件,其中包含一个ComposableNavHostFragment
,它可以作为NavHostFragment
的替代方案,允许您将可组合的目的地添加到导航 XML 文件中。每个composable
目的地必须表示为顶级、无参数的@Composable
方法,其完全限定名称用作每个目的地的android:name
属性。当导航到这些目的地之一时,会创建一个包含片段来显示可组合的内容。
// In HomeScreen.kt
@Composable
fun HomeScreen() {
// Your Composable content here
}
// In your navigation.xml
<composable
android:id="@+id/home_screen"
android:name="com.example.HomeScreenKt\$HomeScreen" />
其他更改
- 导航 Compose 现在依赖于 Compose 1.7.0。
- 导航现在提供了一个新的
CollectionNavType<T>
类,它是NavType<T>
的子类,用于基于集合的参数,例如列表、数组、映射。所有默认的NavType
数组(IntArrayType
、LongArrayType
、FloatArrayType
、BoolArrayType
和StringArrayType
)现在都继承了这个新类。 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 版本发布以及其他 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,默认情况下只支持嵌套在其他类中的枚举。顶级枚举将在下一个版本中得到支持。
错误修复
- 当导航到重复或共享的目的地时,导航将优先导航到从当前位置在图中最近匹配的目的地。(Ic89a4、b/352006850)
- 导航中的安全参数现在添加了一个新的
NavType.EnumType
。这意味着Enum
类型不再需要自定义的NavType
。请注意,Enum
的SerialName
必须是默认的完全限定名称。(I66d22、b/346475493) - 导航中的安全参数添加了对可空参数类型的内置支持,包括
Int?
、Long?
、Float?
、Boolean?
和Enum<*>?
。(I32d13、I1c580、Ifba66、I978b0、Ide076 、b/351994237) NavGraph
的startDestination
现在将使用默认参数值(如果传递给NavGraph
的startDestination
路由与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 支持使用 Bundle 进行参数解析。(I76cdc、b/340966212)- 修复了在使用 Compose 中的类型安全导航时,在进程死亡后恢复应用程序时从恢复状态导致的崩溃。(Ia8f38、b/341801005)
- 修复了导航 Compose 中的一个问题,在取消预测性后退手势后,用户返回到的
NavBackStackEntry
永远不会返回到RESUMED
生命周期的状态。这还确保返回的目的地正确地动画回,而不是在轻扫后立即出现。(I97a0c、b/346608857) - 当使用导航 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.serializeAsValue
和serializeAsValues
的文档,以突出显示最终输出应为 URI 编码。(Ida6bd、b/344943214) - 修复了当使用
CollectionNavType
参数调用toRoute<T>
时发生的崩溃。当使用空CollectionNavType
进行导航时,输出参数将是您可序列化类中声明的默认值,或者是在没有默认值的情况下emptyCollection()
的返回值。(I84158、Id630f、b/342672856)
版本 2.8.0-beta02
2024 年 5 月 29 日
androidx.navigation:navigation-*:2.8.0-beta02
已发布。版本 2.8.0-beta02 包含 这些提交。
错误修复
- 修复了当使用
NavBackStackEntry.toRoute
和可空的自定义NavType
时发生的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)
错误修复
- 已添加导航 Kotlin DSL 函数的缺少参数文档。(I26a36)
版本 2.8.0-alpha08
2024 年 5 月 1 日
androidx.navigation:navigation-*:2.8.0-alpha08
已发布。版本 2.8.0-alpha08 包含 这些提交。
导航 Compose 中的安全参数
- 为 Navigation Compose 和 Navigation Kotlin DSL 用户提供基于 Kotlin Serialization 的编译时类型安全支持的工作已完成,之前实验性的 API 现在已稳定。 (Iea94d, I0eb0d, I873b7, I3a64b, I6c3a2, I11f0b, Ic3032, I8d394, I95710, Ice060, Id0e55, I45f8b, Idcdaf, If5380, I08b23, Ia5c59, b/188693139)
此功能使用 Kotlin Serialization 允许您通过类型安全的对象和数据类在导航图中定义目标。
// Define a home destination that doesn't take any arguments
@Serializable
object Home
// Define a profile destination that takes an ID
@Serializable
data class Profile(val id: String)
// Now define your NavHost using type safe objects
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile)
}
}
有关更多信息,请参阅 Navigation Compose meet Type Safety 博客文章。
新功能
navigation-fragment-compose
工件现在提供一个LocalFragment
,它在ComposableFragment
中的 Composable 方法中是本地可组合的。 (If35e5)NavType
现在对 Int、String、Boolean、Float 和 Long 的列表有内置支持。 (I4b6dd, Ia914c, b/188693139)
版本 2.8.0-alpha07
2024 年 4 月 17 日
androidx.navigation:navigation-*:2.8.0-alpha07
已发布。版本 2.8.0-alpha07 包含 这些提交。
新功能
添加了一个新的
navigation-fragment-compose
工件,其中包含一个ComposableNavHostFragment
,它是NavHostFragment
的替代方案,它允许您将composable
目标添加到您的 Navigation XML 文件中。每个composable
目标必须表示为一个顶层、无参数的@Composable
方法,其完全限定名用作每个目标的android:name
属性。当导航到这些目标之一时,将创建一个包含片段以显示可组合的内容。 (I0ef2e, b/265480755)// In HomeScreen.kt @Composable fun HomeScreen() { // Your Composable content here }
// In your navigation.xml <composable android:id="@+id/home_screen" android:name="com.example.HomeScreenKt\$HomeScreen" />
API 更改
- 继续支持使用基于 Kotlin Serialization 的方法在 Navigation Compose 中使用 Safe Args。这些 API 尚未完成,并用
ExperimentalSafeArgsApi
注释标记。当整个 API 表面在未来的版本中完成时,将删除此注释。 (Iefd95, I409c8, I5b5ac, I7e753, I960f8, I3eabd, I8ed5a, Ied2c9, I9b73c, I554db, Ib3aba, Ia668d, b/188693139)
版本 2.8.0-alpha06
2024 年 4 月 3 日
androidx.navigation:navigation-*:2.8.0-alpha06
已发布。版本 2.8.0-alpha06 包含 这些提交。
API 更改
- 使用基于 Kotlin Serialization 的方法在 Navigation Compose 中支持 Safe Args 已开始。这些 API 尚未完成,并用
ExperimentalSafeArgsApi
注释标记。当整个 API 表面在未来的版本中完成时,将删除此注释。 (I644e7, I98896, I2a1c5, I43a51, I836a1, Ic5eec, I39407, I24e41, If9e14, Ibb13e, If44d3, Icb70f, I8972f, I1d432, Icf32b, I20a14, I262aa, I7de99, I35990, I1033d, b/188693139)
错误修复
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
路由中将参数传递给NavGraph
的startDestination
,而无需依赖defaultValue
。这同样适用于嵌套的NavGraph
startDestinations
。 (I0e0b5, b/109505019, b/188693139)
API 更改
- 添加了新的抽象
CollectionNavType<T>
类,它是NavType<T>
的子类,用于基于集合的参数,例如列表、数组、映射。 (Ic6d63, b/188693139) - 所有默认的
NavType
数组(IntArrayType
、LongArrayType
、FloatArrayType
、BoolArrayType
和StringArrayType
)现在都是CollectionNavType
类型。 (Idcf79, b/188693139) NavType
现在提供了一个新的开放valueEquals
API,它确定相同类型的两个值是否相等。 (I6cb97, b/327229511)
错误修复
- 深层链接中的查询参数现在允许使用大括号包围参数名(即
{argName}
)的值作为基于字符串的NavTypes
的有效值。这修复了一个问题,即此类值将被认为对所有类型都是无效的(或不存在值)。 (I18302, b/327274038) - 支持路由的
NavController
函数(例如navigate
或popBackStack
)现在可以正确匹配填充了 ArrayNavTypes
参数的路由。 (Iea805, b/327229511)
版本 2.8.0-alpha04
2024 年 3 月 6 日
androidx.navigation:navigation-*:2.8.0-alpha04
已发布。版本 2.8.0-alpha04 包含 这些提交。
新功能
- 您现在可以通过将它们定义为
composable
和/或navigation
函数的初始化的一部分来指定过渡中的SizeTranform
。 (I91062, b/296912651)
错误修复
- 修复了在 Compose Navigation 中
NavHost
在没有手势的情况下使用系统后退时无法正确显示过渡的问题。 (Iceeae, b/325998468)
版本 2.8.0-alpha03
2024 年 2 月 21 日
androidx.navigation:navigation-*:2.8.0-alpha03
已发布。 版本 2.8.0-alpha03 包含这些提交。
API 更改
NavBackStackEntry.savedStateHandle
现在标记为@MainThread
,因为它使用了无论如何都需要在主线程上运行的代码。 (Ibb988, b/299523245)
错误修复
- 修复了 Navigation 中导致
NavGraph
ViewModels 过早DESTROYED
的问题,因为关联的条目的ViewModel
不是保存状态的一部分。 (Ib6bb7, b/317581849)
依赖项更新
- Navigation Compose 现在依赖于 Compose 1.7.0-alpha03。
版本 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)
依赖项更新
- Navigation Compose 现在依赖于 Compose
1.7.0-alpha01
,修复了可能导致意外缩放动画的问题。 (b/297258205)
外部贡献
- 感谢 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 包含以下提交。
错误修复
NavGraph
的equals()
函数现在会正确考虑另一个图的节点,而不仅仅是调用者自身。这将确保具有不同 ID 节点的图不再被视为相等。 (I401cb, b/311414915)
版本 2.7.5
版本 2.7.5
2023 年 11 月 1 日
androidx.navigation:navigation-*:2.7.5
已发布。 版本 2.7.5 包含以下提交。
性能改进
- 大幅提升了比较两个图的性能(时间和分配数量方面)。这意味着诸如
setGraph
之类的调用(内部比较新图和现有图)速度更快,并且导致更少的跳帧。感谢 Michał Z 的彻底分析,这带来了此次改进。 (I6ad62) NavHost
现在将在第一次合成传递中渲染起始目标,而不是需要等待第二次传递来读取更新的状态。 (I439a7, b/304852206)
错误修复
- 修复了在你的图中包含链接两个目标的操作的情况下,如果使用完全相同的图多次调用
setGraph
,你的回退栈会弹出的问题。 (Ieaed7) - 快速连续导航到并关闭的对话框将不再泄漏到
NavController.visibleEntries
列表中。 (I67586, b/287969970) - 在弹出一个条目后接着发生配置更改时,如果
saveState
为 false,则该条目的ViewModel
现在将被正确清除。 (Idf242, b/298164648) - 修复了如果回退栈在配置更改或调用
setGraph
之前完全为空,并且只有当传入的 Intent 设置了FLAG_ACTIVITY_NEW_TASK
标志时,NavController
可能会多次处理相同的深层链接的问题。 (I73c7f)
依赖更新
- 带有片段的导航现在依赖于 Fragment 1.6.2,修复了调用
clearBackStack
时嵌套片段的ViewModel
实例不会被清除的问题。
版本 2.7.4
版本 2.7.4
2023 年 10 月 4 日
androidx.navigation:navigation-*:2.7.4
已发布。 版本 2.7.4 包含以下提交。
新功能
- 添加了对
popUpTo
的支持,以使用带有参数的路由,允许弹出回使用这些确切参数的特定条目,与在popBackStack
中找到的支持匹配。 (I731f4, b/299255572)
错误修复
- 修复了使用另一个带有
popUpTo
的导航中断导航时导致FragmentNavigator
崩溃的问题。 (I3c848, b/301887045) - 修复了系统后退键导致
currentDestination
未正确更新以匹配显示的片段的问题。 (Id0d6c, b/289877514) DialogFragment
的生命周期现在将在它上方的对话框关闭时正确地进入RESUMED
状态。 (I88f0d, b/301811387)
版本 2.7.3
版本 2.7.3
2023 年 9 月 20 日
androidx.navigation:navigation-*:2.7.3
已发布。 版本 2.7.3 包含以下提交。
错误修复
- 修复了带有片段的导航中导致
visibleEntries
列表包含不正确条目的问题。 (I5caa9, b/288520638) - 修复了导致浮动窗口目标(例如
Dialogs
、Bottomsheets
等)永远不会获得RESUMED
生命周期回调的问题。 (I3b866, b/287505132)
版本 2.7.2
版本 2.7.2
2023 年 9 月 6 日
androidx.navigation:navigation-*:2.7.2
已发布。 版本 2.7.2 包含以下提交。
错误修复
- 导航现在依赖于 Lifecycle
2.6.2
,修复了rememberSaveable
和 Navigation Compose 的NavHost
之间的交互问题,该问题会导致目标的rememberSaveable
状态和任何ViewModel
拥有的SavedStateHandle
实例在进程死亡和重新创建后无法正确恢复。 (b/298059596, b/289436035) - 修复了在 Navigation Compose 中同时显示多个对话框时,部分遮挡的对话框(例如,不是最顶层的对话框)将处于
CREATED
生命周期状态而不是STARTED
状态的问题。 (aosp/2728520, b/289257213) - 修复了在 Navigation Compose 中同时显示多个对话框时,关闭最顶层的对话框会导致新的最顶层对话框卡在
STARTED
生命周期状态而不是正确地进入RESUMED
状态的问题。 (aosp/2629401, b/286371387) - Navigation Safe Args 现在如果实际上没有被执行,就不会急切地实例化它的任务。 (I0e385, b/260322841)
依赖项更新
- Navigation Compose 现在依赖于 Compose 1.5.1。
版本 2.7.1
版本 2.7.1
2023 年 8 月 23 日
androidx.navigation:navigation-*:2.7.1
已发布。 版本 2.7.1 包含以下提交。
错误修复
- 修复了 Navigation with Compose 中的问题,在使用
Scaffold
时,可能会出现尝试访问Lifecycle.State.DESTROYED
ViewModel
的错误。 (I1dc11, b/268422136)
版本 2.7.0
版本 2.7.0
2023 年 8 月 9 日
androidx.navigation:navigation-*:2.7.0
已发布。 版本 2.7.0 包含以下提交。
自 2.6.0 以来重要变更
Accompanist 中的动画
现在 AnimatedContent
已稳定,我们能够将代码从 Accompanist Navigation Animation 移回 Navigation Compose 本身。
这意味着 AnimatedNavHost
中存在的所有设置自定义过渡的支持,都直接在 NavHost
中得到支持。
Accompanist Navigation Animation 将不再进行任何更改,我们将很快正式弃用它,并提供有关如何迁移回 Navigation Compose 本身的指导,但这将与 迁移指南 相反,如果您已经使用最新版本的 Accompanist alpha (0.31.2-alpha
),则无需进行其他 API 更改。 (b/197140101)
错误修复
- Navigation Compose 中的 NavHost 现在可以正确拦截系统后退调用,即使在 Activity 被 STOPPED 和 RESUMED 之后也是如此。 (Icb6de, b/279118447)
依赖更新
- 导航现在依赖于 Compose
1.5.0
,从1.1.0
开始。
版本 2.7.0-rc01
2023 年 7 月 26 日
androidx.navigation:navigation-*:2.7.0-rc01
已发布。 版本 2.7.0-rc01 包含这些提交。
错误修复
- 修复了
EnterTransition
和ExitTransition
lambda 表达式(作为NavHost
的一部分创建)即使在NavHost
从组合中移除后也可能保留在内存中的问题。 (I893d0)
已知问题
- 导航 2.6.x 中存在一个问题,在使用 popUpTo 进行导航时,可能会导致
IllegalArgumentException
。 您可以通过重新构建导航图来避免此异常,类似于 此处 提出的建议。 (b/287133013)
版本 2.7.0-beta02
2023 年 6 月 28 日
androidx.navigation:navigation-*:2.7.0-beta02
已发布。 版本 2.7.0-beta02 包含这些提交。
错误修复
- 导航 Compose 现在为使用
popUpTo
选项的 navigate 进行自定义过渡提供了正确的 z 顺序。(/Ib1c3a, b/285153947)
版本 2.7.0-beta01
2023 年 6 月 7 日
androidx.navigation:navigation-*:2.7.0-beta01
已发布。 版本 2.7.0-beta01 包含这些提交。
错误修复
- 导航 Compose 中的
NavHost
现在可以正确拦截系统后退调用,即使在Activity
已STOPPED
和RESUMED
之后。 (Icb6de, b/279118447)
版本 2.7.0-alpha01
2023 年 5 月 24 日
androidx.navigation:navigation-*:2.7.0-alpha01
已发布。 版本 2.7.0-alpha01 包含这些提交。
Accompanist 中的动画
现在 AnimatedContent
已稳定,我们能够将代码从 Accompanist Navigation Animation 移回 Navigation Compose 本身。
这意味着 AnimatedNavHost
中存在的所有设置自定义过渡的支持,都直接在 NavHost
中得到支持。
Accompanist Navigation Animation 不会再进行任何修改,我们将很快正式弃用它,并提供有关如何迁移回 Navigation Compose 本身的指南,但如果已经使用最新的 Accompanist alpha (0.31.2-alpha
),这将与 迁移指南 相反,无需进行其他 API 修改。 (b/197140101)
错误修复
- 从 Navigation
2.6.0-rc02
开始:修复了 Navigation 在 Fragments 中使用popUpTo
进行导航以及在不重新创建视图的情况下从回退栈中弹出 Fragment 导致系统后退停止工作的问题。 (Ieb8d4, b/281726455)
依赖更新
- Navigation 现在依赖于 Compose
1.5.0-beta01
。
版本 2.6.0
版本 2.6.0
2023 年 6 月 7 日
androidx.navigation:navigation-*:2.6.0
已发布。 版本 2.6.0 包含这些提交。
自 2.5.0 以来 Navigation 的重要更改
NavBackStackEntry
的arguments
以及传递给OnDestinationChangedListener
的arguments
现在只是在导航到目标时创建的不可变参数的副本。 这意味着对这些 Bundle 所做的任何更改都不会反映在随后对arguments
或其他OnDestinationChangedListener
实例的访问中。NavDeepLink
现在支持数组的默认值,这允许支持将映射到参数数组类型的重复查询参数。NavType
也现在包含一个默认方法,可以覆盖该方法来组合两个解析的值。NavType
的自定义子类现在可以覆盖serializeAsValue
将值序列化为字符串,允许在NavType
类中完全封装序列化和反序列化(通过parseValue
)。StringType
现在覆盖此方法以对给定的String
调用Uri.encode
。
自 2.5.0 以来 Navigation Compose 的重要更改
- 在使用
NavHost
预览可组合时,它现在将默认显示导航图的startDestination
。 NavController.popBackStack(route)
、NavController.getBackStackEntry(route)
、NavController.clearBackStack(route)
现在都支持带有部分或完全填充参数的路由。 请注意,参数必须与条目参数完全匹配。- 尝试使用
navDeepLink
Kotlin DSL 创建一个空的NavDeepLink
现在将导致一个 lint 警告,指示深层链接需要 uri、操作和/或 mimetype 才能有效。
自 2.5.0 以来 Navigation with Fragments 的重要更改
NavHostFragment
不再自行拦截系统后退按钮。 这允许底层的FragmentManager
处理系统后退。 这允许 Fragment1.7.0-alpha01
及更高版本在 Android U 设备上提供应用内预测后退动画。- 在使用 Navigation with Fragments 时,尝试手动执行
FragmentTransaction
将 Fragment 添加到FragmentManager
的回退栈中现在将抛出IllegalArgumentException
。 您应该始终通过navigate()
API 添加 Fragment。 - 在使用导航 XML 文件的活动元素中的
app:data
和app:dataPattern
属性中使用精确字符串${applicationId}
作为占位符时,占位符将在膨胀时自动填充为上下文的packageName
。 FragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。 这意味着NavBackStackEntry
Lifecycle
现在将在进入和退出 Fragment 的特殊效果完成之前等待,然后再将其最终的Lifecycle.State
移动。DialogFragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。 这意味着NavBackStackEntry
Lifecycle
现在将等待DialogFragment
Lifecycle
移动到DESTROYED
然后再将其自身移动到DESTROYED
。NavHostFragment
现在允许您在NavHostFragment
附加到FragmentManager
时立即检索NavController
,而不仅仅是在onCreate()
之后。- Navigation 对动态功能模块的支持现在依赖于细粒度的 Play Feature Delivery 库。
- Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。 这意味着它现在只与版本 7.3.0 及更高版本兼容。
自 2.5.0 以来 NavigationUI 的重要更改
- 当将导航图的 ID 传递给
AppBarConfiguration
(例如通过Menu
)时,NavigationUI
现在只将该导航图的起始目标视为顶级目标,而不是错误地将图中的每个目标标记为顶级目标。 传递单个目标 ID 的行为保持不变。 您可以在自己的代码中通过AppBarConfiguration
上的新isTopLevelDestination
函数获得相同的功能。 NavigationUI
中用于处理顶部应用栏的setupWithNavController
集成现在将解析在导航 XML 文件中android:label
中找到的ReferenceType
参数的R.string
值,并将它们转换为字符串值,而不是输出自动生成的资源整数。NavigationUI
现在在无法通过选定的MenuItem
进行导航时提供日志。
版本 2.6.0-rc02
2023 年 5 月 24 日
androidx.navigation:navigation-*:2.6.0-rc02
已发布。 版本 2.6.0-rc02 包含这些提交。
错误修复
- 修复了 Navigation 在 Fragments 中使用
popUpTo
进行导航以及在不重新创建视图的情况下从回退栈中弹出 Fragment 导致系统后退停止工作的问题。 (Ieb8d4, b/281726455)
版本 2.6.0-rc01
2023 年 5 月 10 日
androidx.navigation:navigation-*:2.6.0-rc01
已发布。 版本 2.6.0-rc01 包含这些提交。
错误修复
- 修复了 Navigation 在 Fragments 中存在的一个问题,使用
popUpTo
在其onResume()
生命周期回调中通过 navigate 移除 Fragment 将导致IllegalStateException
。 (I21884, b/279644470)
版本 2.6.0-beta01
2023 年 4 月 19 日
androidx.navigation:navigation-*:2.6.0-beta01
已发布。 版本 2.6.0-beta01 包含这些提交。
新功能
NavBackStackEntry
现在提供了一个自定义的toString
实现。 (Iff00b)
错误修复
- 在使用 Navigation with Fragments 时,尝试手动执行
FragmentTransaction
将 Fragment 添加到FragmentManager
的回退栈中现在将抛出IllegalArgumentException
。 您应该始终通过navigate()
API 添加 Fragment。 (I6d38e) - 当存在一个添加条目的
navigate
和一个在同一帧中将其移除的popBackStack
时,回退栈上的最终顶部条目现在将始终恢复到RESUMED
Lifecycle.State
。 (Id8067, b/276495952)
版本 2.6.0-alpha09
2023 年 4 月 5 日
androidx.navigation:navigation-*:2.6.0-alpha09
已发布。 版本 2.6.0-alpha09 包含这些提交。
错误修复
- 修复了对无效路由的检查,这样如果一个
NavDestination
包含非空NavArgument
,这个目的地的路由必须包含与非空NavArgument
相同名称的占位符。 (Ic62bf, b/274697949) - 基于
Action/MimeType
的深层链接导航现在将在导航操作缺少Action/MimeType
匹配的NavDestination
所需的非空NavArgument
时失败。 (Ibfa17, b/271777424) - 当
NavController
设置一个与之前图具有相同路由和目的地的图时,它现在会正确地用新实例替换其当前图节点及其后退栈目的地。这修复了在 Navigation Compose 中使用onLaunchSingleTop
而不保存状态时发生的崩溃。这也修复了导航到与根图关联的目的地的错误,该错误会导致构建不正确的后退栈。 (I5bc58, b/275258161, b/275407804)
版本 2.6.0-alpha08
2023 年 3 月 22 日
androidx.navigation:navigation-*:2.6.0-alpha08
已发布。 版本 2.6.0-alpha08 包含以下提交。
新功能
NavHostFragment
现在允许您在NavHostFragment
附加到FragmentManager
时立即检索NavController
,而不仅仅是在onCreate()
之后。 (Ic6382, b/220186282)
错误修复
- 修复了在弹出包含非空参数的嵌套图时发生的
NullPointerException
。 (6b3581, b/249988437) - 在使用系统返回执行带有
popUpTo
的导航后,NavController
的状态将弹出到正确的条目。 (I3a8ec, b/270447657) FragmentNavigator
现在将在通过系统返回或popBackStack()
弹出后退栈时以及事务是否使用片段的特效来正确弹出条目。 (I81bdf)- 将片段添加到
FragmentNavigator
的FragmentManager
中而不使用导航将不再导致崩溃。 (b17204, b/274167493)
依赖更新
- 导航现在依赖于 Lifecycle
2.6.1
。 (586fe7) - 导航现在依赖于 SavedState
1.2.1
。 (078e4e) - 导航现在依赖于 ProfileInstaller
1.3.0
。 (512f0c)
版本 2.6.0-alpha07
2023 年 3 月 8 日
androidx.navigation:navigation-*:2.6.0-alpha07
已发布。 版本 2.6.0-alpha07 包含以下提交。
错误修复
- 接受路由的
getBackStackEntry
、popBackStack
、clearBackStack
API 变体现在接受具有可空参数和可空查询参数的路由模式 (I22294, b/269302500) - 修复了从
NavController
调用clearBackStack()
不会清除与已清除后退栈关联的片段管理器中的保存状态的问题。 (Ic1cce, b/271190202) - 修复了 2.6.0-alpha06 中的回归,该回归会导致在使用系统返回在标签之间切换时,
BottomNavigationView
中的错误MenuItem
被选中。 (I634f6, b/270447657) - 修复了 2.6.0-alpha06 中的回归,该回归会导致
NavBackStackEntry
在使用Animation
时不会移动到 RESUMED 状态。 (Ib3589, b/269646882)
版本 2.6.0-alpha06
2023 年 2 月 22 日
androidx.navigation:navigation-*:2.6.0-alpha06
已发布。 版本 2.6.0-alpha06 包含以下提交。
新功能
- 在使用
NavHost
预览可组合时,它现在将默认显示 NavGraph 的startDestination
。 (I2b89f)
API 更改
- 所有
NavController
navigate
重载现在都用@MainThread
进行注释,以确保它们在主线程上被调用。 (I2c0b0, b/263427111)
错误修复
- 修复了在使用动态片段导航时尝试导航时发生的崩溃。 (I3ee29, b/268360479)
- 修复了通过系统返回按钮导航到另一个片段时,底部栏不会更新到正确选定项的错误 (If559f, b/269044426)
已知问题
- 在将 Navigation 与 Fragments 一起使用时,
NavBackStackEntry
的 Lifecycle 在使用Animation
API 时无法达到RESUMED
。 (b/269646882) - 在将 Navigation 与 Fragments 一起使用时,以及使用
BottomNavigation
导航时,如果尝试恢复具有多个条目的后退栈,BottomMenuItem
不会被正确更新。 (b/270447657) - 在将 Navigation 与 Fragments 一起使用时,在恢复状态后,
NavBackStackEntry
Lifecycle
在其片段被DESTROYED
时不会被DESTROYED
。 (b/270610768)
版本 2.6.0-alpha05
2023 年 2 月 8 日
androidx.navigation:navigation-*:2.6.0-alpha05
已发布。 版本 2.6.0-alpha05 包含以下提交。
新功能
NavController.popBackStack(route)
、NavController.getBackStackEntry(route)
、NavController.clearBackStack(route)
现在都支持具有部分或完全填充参数的路由。注意,参数必须与条目的参数完全匹配。 (Iebd28, Ic678c, I3b37b, b/257514373)FragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。这意味着NavBackStackEntry
Lifecycle
现在将等待进入和退出片段的特殊效果完成,然后再将其最终的Lifecycle.State
移动到最终状态。 (I3cb19, b/238686802)DialogFragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。这意味着NavBackStackEntry
Lifecycle
现在将等待DialogFragment
Lifecycle
移动到DESTROYED
,然后再移动到DESTROYED
本身。 (I53ee5, b/261213893)
API 更改
NavigatorState
现在提供prepareForTransition
API,允许Navigator
将NavBackStackEntries
移动到中间Lifecycle.State
。 (I42c21, b/238686802)- 您现在可以通过
backstack
属性访问与NavGraphNavigator
或ComposeNavigator
关联的后退栈。ComposeNavigator
现在还公开了onTransitionComplete()
回调,以将已执行导航或popBackStack
操作的NavBackStackEntry
标记为已完成。 (I02062, I718db, b/257519195)
错误修复
- 导航器状态现在在使用
push/popWithTransition
API 并且条目正在处理时将执行无操作。 (Iadbfa, b/261213893) - 在使用
launchSingleTop
以及嵌套的NavGraph
时,从原始目的地到其startDestination
的所有目的地将仅被正确地添加到后退栈的顶部。 (Id4bea, b/253256629) - 导航现在将正确地替换
DialogFragment
实例,当使用launchSingleTop
标志设置为 true 导航到同一目的地时。 (I45b5a, b/149572817) - 导航 SafeArgs 在使用长度正好为 19 个字符的参数时,将不再导致编译错误。 (Id60bc, b/257110095)
版本 2.6.0-alpha04
2022 年 11 月 9 日
androidx.navigation:navigation-*:2.6.0-alpha04
已发布。 版本 2.6.0-alpha04 包含以下提交。
新功能
- 现在,
NavType
的自定义子类可以覆盖serializeAsValue
以将值序列化为字符串,允许在NavType
类中完全封装序列化和反序列化(通过parseValue
)。StringType
现在覆盖此方法以在给定的String
上调用Uri.encode
。(Ie5213,b/247637434) NavigationUI
现在在无法通过选定的MenuItem
导航时提供日志。(I2af5a,b/247730357)
错误修复
- 导航深层链接现在在图初始化时被延迟解析,而不是在图初始化时解析,这可以提高应用程序启动时的性能。(Iab0ab)
- 修复了在深层链接到具有空默认参数的目的地后向上导航导致崩溃的错误。(I51c24,b/243183636)
依赖项更新
- 导航对动态功能模块的支持现在依赖于细粒度的 Play 功能交付库。(Ib4ddc)
- 导航安全参数现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与 7.3.0+ 版本兼容。(I47e49)
版本 2.6.0-alpha03
2022 年 10 月 24 日
androidx.navigation:navigation-*:2.6.0-alpha03
已发布。版本 2.6.0-alpha03 包含这些提交。
错误修复
- 从 导航
2.5.3
:NavHost
将不再在没有可用于Crossfade
合成的目的地时导致NoSuchElementException
。它现在将跳过合成。(Ieb46e,b/253299416) - 从 导航
2.5.3
:修复了当目的地从后退栈中弹出时,保存的 Compose 状态(例如rememberSaveable
的用法)未被遗忘且未被删除的问题。(I64949)
依赖更新
- 导航现在依赖于 Fragment
1.5.4
。(Icd424)
版本 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 文件的活动元素中的
app:data
和app:dataPattern
属性中使用确切的字符串${applicationId}
作为占位符时,占位符将在膨胀时自动填充上下文的packageName
。(Iaabde,b/234223561) - 尝试使用
navDeepLink
Kotlin DSL 创建一个空的NavDeepLink
现在会导致 lint 警告,指示深层链接需要 uri、操作和/或 mimetype 才能有效。(I08d2f,b/154038883)
API 更改
- 添加了新的
NavDestination
扩展函数,用于将形式为android:label="{arg}"
的动态标签解析为字符串。通过将R.string
值解析为它们的字符串值,支持ReferenceType
参数。(I07d89,b/236269380)
行为更改
- NavBackStackEntry 的
arguments
以及传递给OnDestinationChangedListener
的arguments
现在只是在您导航到目的地时创建的不可变参数的副本。这意味着对这些 Bundles 所做的任何更改都不会反映在后续对arguments
或其他OnDestinationChangedListener
实例的访问中。(I676f5)
错误修复
- 从 导航
2.5.2
:动态导航现在会在导航到它们之前正确尝试安装来自其他模块的 Activity 目的地。(Ia2c16,b/240292838) - 从 导航
2.5.2
:导航现在将在导航到同一目的地并设置launchSingleTop
标志为 true 时正确替换 Fragment 实例。(I5a2f1,b/237374580) - 从 导航
2.5.2
:修复了由导航到与新弹出的起始目的地共享父级的双重嵌套图导致的IllegalStateException
。(I9f7cb,b/243778589)
版本 2.5
版本 2.5.3
2022 年 10 月 24 日
androidx.navigation:navigation-*:2.5.3
已发布。版本 2.5.3 包含这些提交。
错误修复
NavHost
将不再在没有可用于Crossfade
合成的目的地时导致NoSuchElementException
。它现在将跳过合成。(Ieb46e,b/253299416)- 修复了当目的地从后退栈中弹出时,保存的 Compose 状态(例如
rememberSaveable
的用法)未被遗忘且未被删除的问题。(I64949)
版本 2.5.2
2022 年 9 月 7 日
androidx.navigation:navigation-*:2.5.2
已发布。版本 2.5.2 包含这些提交。
错误修复
- 动态导航现在会在导航到它们之前正确尝试安装来自其他模块的 Activity 目的地。(Ia2c16,b/240292838)
- 导航现在将在导航到同一目的地并设置
launchSingleTop
标志为 true 时正确替换 Fragment 实例。(I5a2f1,b/237374580) - 修复了由导航到与新弹出的起始目的地共享父级的双重嵌套图导致的
IllegalStateException
。(I9f7cb,b/243778589)
依赖项更新
- 导航
2.5.2
现在依赖于 Fragment1.5.2
。(aosp/2178734)
版本 2.5.1
2022 年 7 月 27 日
androidx.navigation:navigation-*:2.5.1
已发布。版本 2.5.1 包含这些提交。
错误修复
导航安全参数
将不再在将Bundle
中保存的自定义参数类型一起使用时导致生成类中的弃用警告。(Id86ed,b/237725966)
依赖更新
- 导航库现在依赖于 Lifecycle
2.5.1
。(Ib4451) - 导航库现在依赖于 Activity
1.5.1
。(I3efe8) - 导航库现在依赖于 Fragment
1.5.1
。(I56177)
版本 2.5.0
2022 年 6 月 29 日
androidx.navigation:navigation-*:2.5.0
已发布。版本 2.5.0 包含这些提交。
自 2.4.0 以来重要的更改
- CreationExtras 集成 -
Navigation
现在可以通过 Lifecycle2.5.0
的CreationExtras
提供一个无状态ViewModelProvider.Factory
。
导航安全参数
导航安全参数
已将Android Gradle 插件
依赖关系升级为依赖7.0.4
,放弃了对7.0
之前的 AGP 版本的兼容性。- 新增对命名空间 build.gradle 属性的支持,可用于替换 applicationId。
其他更改
visibleEntries
API 已不再是实验性功能,并提供了一个函数,用于检索所有其目标当前根据NavController
的可见性规则而可见的条目。
版本 2.5.0-rc02
2022 年 6 月 15 日
androidx.navigation:navigation-*:2.5.0-rc02
已发布。 版本 2.5.0-rc02 包含这些提交。
错误修复
- 修复了在使用 Navigation Compose
NavHost
时,快速切换底部目标导致的崩溃问题。 (I3979a, b/234054916) Navigation SafeArgs
在使用applicationIdSuffix
和命名空间且没有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
文件中将<deeplink>
元素放置在<activity>
元素中。(Ic15a5, b/178403185)
错误修复
NavHost
和DialogHost
中的可组合作用域现在按预期顺序释放,即内部可组合项在外部可组合项之前释放。 (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 更改
visibleEntries
已不再是实验性功能。 (I4829f, b/225394514)
错误修复
- NavHost 现在依赖于
NavController
中的visibleEntries
来确定要组合哪些条目。这意味着在使用嵌套 NavHost 时,内部NavHost
现在应该能够正确地进行动画淡出。 (I4ba2b, b/225394514) NavController
提供的visibleEntries
StateFlow
现在基于条目的最大生命周期状态,而不是当前的生命周期状态。这意味着即使navController
的主机生命周期降至 STARTED 以下,可见条目列表也将保持不变。 (I9e2a8, b/225394514)SavedStateViewFactory
现在支持即使在使用SavedStateRegistryOwner
初始化时,也使用CreationExtras
。如果提供了额外信息,则初始化参数将被忽略。 (I6c43b, b/224844583)NavDeepLink
现在可以解析只有一个没有值的查询参数的 URI。 (I0efe8, b/148905489)- 空字符串现在被视为深层链接中有效的参数。 (I70a0d, b/217399862)
Navigation Safe Args
在使用命名空间且没有AndroidManifest.xml
时将不再崩溃。 (I17ccf, b/227229815)
版本 2.5.0-alpha03
2022 年 2 月 23 日
androidx.navigation:navigation-*:2.5.0-alpha03
已发布。 版本 2.5.0-alpha03 包含这些提交。
API 更改
- 现在可以将
CreationExtras
传递给by navGraphViewModels
,以创建一个ViewModel
。 (I29217, b/217618359)
错误修复
NavDeepLinks
现在正确地支持嵌入在路由/深层链接 URI 中的编码换行符。 (I513d1, b/217815060)CreationExtras
现在在与NavBackStackEntries
一起使用以创建 ViewModels 时将能够正常工作。 (I69161, b/217617710)- Navigation Safe Args 现在支持使用
build.gradle
中定义的命名空间来代替 AndroidManifest 中的包名。 (I659ef, b/217414933)
版本 2.5.0-alpha02
2022 年 2 月 9 日
androidx.navigation:navigation-*:2.5.0-alpha02
已发布。 版本 2.5.0-alpha02 包含这些提交。
错误修复
- 从 Navigation
2.4.1
开始:NavHostFragment
现在在使用 viewbinding 和嵌套图时将正确地设置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 包含这些提交。
新功能
NavBackStackEntry
现在与 ViewModel CreationExtras 集成,CreationExtras 作为 Lifecycle2.5.0-alpha01
的一部分引入。 (Ib9fe2, b/207012490)
错误修复
- 修复了从片段的
onCreate()
访问通过by navGraphViewModels()
创建的ViewModel
时,会导致出现IllegalStateException
的问题。 (I8a14d) NavDeepLink
将不再不必要地对参数进行两次解码,这意味着现在将正确地将参数传递给您的最终目标。 (I31b0a, b/210711399)
安全参数
- Safe Args 现在依赖于 Android Gradle Plugin 版本 7.0.4。这意味着 Navigation Safe Args 将不再与 Android Studio 版本 7.0 之前的版本兼容,但现在与 Android Gradle Plugin 7.1.0 及更高版本兼容。 (I41c88, b/213086135, b/207670704)
版本 2.4.2
版本 2.4.2
2022 年 4 月 6 日
androidx.navigation:navigation-*:2.4.2
已发布。 版本 2.4.2 包含这些提交。
错误修复
- 从 Navigation
2.5.0-alpha03
回溯:NavDeepLinks
现在正确地支持嵌入在路由/深层链接 URI 中的编码换行符。 (I513d1, b/217815060) - 从 Navigation
2.5.0-alpha03
回溯:Navigation SafeArgs 现在支持使用build.gradle
中定义的命名空间来代替 AndroidManifest 中的包名。 (I659ef, b/217414933) - 从 Navigation
2.5.0-alpha04
回溯:Navigation Safe Args
在使用命名空间且没有AndroidManifest.xml
时将不再崩溃。 (I17ccf, b/227229815) - 从 Navigation
2.5.0-alpha04
回溯:空字符串现在被视为深层链接中有效的参数。 (I70a0d, b/217399862)
版本 2.4.1
版本 2.4.1
2022 年 2 月 9 日
androidx.navigation:navigation-*:2.4.1
已发布。 版本 2.4.1 包含这些提交。
错误修复
NavHostFragment
现在在使用 viewbinding 和嵌套图时将正确地设置OnBackPressedDispatcher
。 (Ifbb51, b/214577959)- 当通过多个嵌套的
NavGraph
进行深度链接时,后退栈现在将正确包含中间的开始目标。 (I504c0, b/214383060) - 从 Navigation
2.5.0-alpha01
回退:修复了从 Fragment 的onCreate()
访问通过by navGraphViewModels()
创建的 ViewModel 会导致IllegalStateException
的问题。 (I8a14d) - 从 Navigation
2.5.0-alpha01
回退:NavDeepLink
不会再不必要地对参数进行两次解码,这意味着现在将正确解码的参数传递给最终的目标。 (I31b0a, b/210711399) - 从 Navigation
2.5.0-alpha01
回退:Safe Args 现在依赖于 Android Gradle Plugin 版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle Plugin 7.1.0 及更高版本兼容。 (I41c88, b/213086135, b/207670704)
版本 2.4.0
版本 2.4.0
2022 年 1 月 26 日
androidx.navigation:navigation-*:2.4.0
已发布。 版本 2.4.0 包含这些提交。
自 2.3.0 以来的重要更改
- 所有 Navigation 工件都已用 Kotlin 重写。这改进了使用泛型(例如
NavType
子类)的类的可空性。所有以前属于-ktx
工件的 Kotlin 扩展函数已移动到各自的主工件。-ktx
工件将继续发布,但完全为空。 navigation-fragment
工件现在包含一个通过新的AbstractListDetailFragment
预构建的 双窗格布局 的实现。此片段使用SlidingPaneLayout
来管理列表窗格(您的子类提供)和详细窗格,该窗格使用NavHostFragment
作为其实现,如我们的 示例实现 所示。NavController
上的currentBackStackEntryAsFlow()
方法提供了一个Flow
,它会在当前的NavBackStackEntry
发生更改时发出。此流程可以用作手动管理OnDestinationChangedListener
的替代方法。- NavController 现在提供了通过实验性的
visibleEntries
属性检索所有可见NavBackStackEntry
实例列表作为StateFlow
的功能。 - 现在可以扩展
NavType
类以创建自定义 NavType。自定义类型仅在以编程方式构建导航图时受支持,例如通过 导航图 Kotlin DSL。 Navigation 现在提供了
findStartDestination()
和getHierarchy()
API,可用于帮助实现自定义 NavigationUI。findStartDestination()
是NavGraph
上的扩展函数,它将定位当您导航到图时将显示的实际起始目标,即使startDestination
本身是一个嵌套的NavGraph
。getHierarchy()
是NavDestination
上的函数,可用于验证给定目标是否位于另一个目标的层次结构中。val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
采用
BottomNavigationView
的NavigationUI
方法已更新,改为采用 Material1.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
的“路径”部分,例如 home
、profile/{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 构建导航图,使用composable
和dialog
目标,以及对可选导航器的支持,例如来自 Accompanist Navigation Material 的导航器。 - 对目标之间交叉淡入淡出的强制支持。 Accompanist Navigation Animation 可用于使用实验性的 Compose API 控制进入和退出过渡。
- 对每个可组合目标的
Lifecycle
进行范围限定。每个目标仅在所有进入过渡完成时才能达到RESUMED
状态,并在所有退出过渡开始时立即降级到STARTED
状态,因此您可以通过仅在Lifecycle
为RESUMED
时触发navigate
调用来避免所有IllegalStateException
和多点触控问题。 - 在目标级别对
ViewModel
(通过 Lifecycle ViewModel Compose2.4.0
的viewModel()
API 或 Hilt Navigation Compose1.0.0
的hiltViewModel()
)进行范围限定,提供一个在配置更改和位于后退栈上(当您的可组合内容被处置时)时生存的范围,以及在 ViewModel 的onCleared()
中的信号,该信号指示与该NavBackStackEntry
相关联的状态的永久处置和清理。 - 在目标级别对
rememberSaveable
状态进行范围限定,确保所有可组合状态在您返回目标时自动保存和恢复。 - 完全支持在进程死亡和重建后保存和恢复
NavController
及其目标状态。 - 与系统后退按钮的自动集成。
支持传递参数、将深度链接附加到目标以及将结果返回到以前的目标。
在
rememberNavController()
和currentBackStackEntryAsState()
中的 Compose 特定帮助程序,以允许 提升状态 并将NavController
连接到NavHost
外部的可组合项(例如底部导航栏)。
val navController = rememberNavController()
Scaffold { innerPadding ->
NavHost(navController, "home", Modifier.padding(innerPadding)) {
composable("home") {
// This content fills the area provided to the NavHost
HomeScreen()
}
dialog("detail_dialog") {
// This content will be automatically added to a Dialog() composable
// and appear above the HomeScreen or other composable destinations
DetailDialogContent()
}
}
}
有关更多信息,请参阅 Compose 导航指南。
多个后退栈
NavController 负责管理目标的后退栈,当您 navigate()
到目标时将目标添加到后退栈,并在您调用 popBackStack()
或触发系统后退按钮时将其删除。现有的 NavOptions
类以及与导航图 XML 中的 <action>
元素的集成已扩展以支持保存和恢复后退栈。
作为此更改的一部分,NavigationUI
的 onNavDestinationSelected()
、BottomNavigationView.setupWithNavController()
和 NavigationView.setupWithNavController()
方法现在会自动保存和恢复已弹出目标的状态,从而在无需任何代码更改的情况下支持多个后退栈。在将 Navigation 与 Fragment 一起使用时,这是与多个后退栈集成的推荐方法。
用于保存和恢复状态的基础 API 通过多个表面公开
在 Navigation XML 中,
<action>
元素现在可以使用app:popUpToSaveState
和app:restoreState
的布尔属性来保存通过app:popUpTo
弹出的任何目标的状态,并恢复与作为app:destination
传递的目标相关联的状态。<action android:id=”@+id/swap_stack” app:destination=”@id/second_stack” app:restoreState=”true” app:popUpTo=”@id/first_stack_start_destination” app:popUpToSaveState=”true” />
在
navOptions
Kotlin DSL 中,您可以在popUpTo
构建器 上添加restoreState
布尔属性和saveState
布尔属性。// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.findStartDestination().id) { saveState = true } }
在通过
NavOptions.Builder
手动构建NavOptions
对象时,您可以使用setRestoreState()
和setPopUpTo()
的新重载,该重载接受一个额外的saveState
参数。NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);
现在,对
popBackStack()
的编程调用可以包含一个额外的saveState
参数。您可以使用
clearBackStack()
方法清除使用popBackStack()
或popUpToSaveState
保存的任何状态。
在所有情况下,NavController
将保存和恢复每个 NavBackStackEntry
的状态,包括任何导航目标范围的 ViewModel
实例。Navigator
API 已更新,以使每个 Navigator
能够支持保存和恢复其自身的状态。
行为变更
NavDeepLinkBuilder
现在将PendingIntent.FLAG_IMMUTABLE
添加到createPendingIntent()
返回的PendingIntent
中,确保此 API 在针对 Android 12 时按预期工作。- 导航现在依赖于 Lifecycle
2.3.1
,并将setGraph()
、popBackStack()
、navigateUp()
和navigate()
(更新NavBackStackEntry
Lifecycle
的方法)标记为@MainThread
,使导航与 Lifecycle2.3.0
中引入的主线程强制执行保持一致。 - 深层链接现在会验证所有必需参数(没有默认值的那些参数)是否都存在于
Uri
中。 NavDeepLink
解析的参数现在将井号视为与问号相同的方式作为路径段之间的分隔符,防止参数跨越井号。- 在生成操作时,从 Safe Args 生成的 Kotlin 代码现在将没有默认值的参数放在具有默认值的那些参数之前。
- 在生成参数时,Safe Args 现在将没有默认值的参数放在具有默认值的那些参数之前。
- Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。这意味着您不再会收到使用
applicationIdTextResource
的警告。
已知问题
- 在 Navigation
2.5.0-alpha01
中修复:从 Fragment 的onCreate()
访问通过by navGraphViewModels()
创建的ViewModel
会导致IllegalStateException
错误。(b/213504272) - 在 Navigation
2.5.0-alpha01
中修复:Safe Args 2.4.0 与 Android Gradle 插件 7.1.0 及更高版本不兼容。(b/213086135) - 使用多个嵌套导航图进行深层链接无法正确创建完整的回退栈。(b/214383060)
版本 2.4.0-rc01
2021 年 12 月 15 日
androidx.navigation:navigation-*:2.4.0-rc01
已发布。版本 2.4.0-rc01 包含这些提交。
行为变更
NavDeepLink
解析的参数现在将井号视为与问号相同的方式作为参数之间的分隔符。(I21309, b/180042703)
错误修复
- 深层链接将不再忽略其值与占位符名称相同的参数。(If8017, b/207389470)
NavController
在NavController
恢复后使用过渡弹出嵌套目标时将不再崩溃。(I0f7c9, b/205021623)- 使用无效的
startDestination
时,错误消息现在将默认设置为起始目标的路由(如果有)。(I86b9d, b/208041894)
导航 Compose 错误修复
- 修复了使用底部导航菜单项在起始目标和其他目标之间快速切换时造成的潜在崩溃。(Ic8976, b/208887901)
- 对话框目标现在在配置更改或进程死亡后会正确地恢复到屏幕顶部。(I4c0dc, b/207386169)
- 修复了尝试从对话框的
NavBackStackEntry
中检索ViewModel
时,在对话框被关闭时会失败的问题。(I6b96d, b/206465487) - 修复了在使用 Navigation Compose 的
NavHost
的activity
目标时会导致无限重组的问题。(I8f64c) - 修复了 Navigation Compose 中的内存泄漏问题,该问题在配置更改或进程死亡后会保留对旧活动的引用。(I4efcb, b/204905432)
Safe Args 错误修复
SafeArgs
在尝试在进程死亡后恢复自定义可解析数组时不再崩溃。(I618e8, b/207315994)- 修复了 safe args 中的一个错误,该错误不允许布尔型数组具有
null
值。(I8c396, b/174787525)
版本 2.4.0-beta02
2021 年 11 月 3 日
androidx.navigation:navigation-*:2.4.0-beta02
已发布。版本 2.4.0-beta02 包含这些提交。
API 更改
- 对显式和隐式深层链接的处理现在会在导航到另一个图时自动添加
saveState
标志,确保诸如NavigationUI.setupWithNavController
之类的代码和使用多个回退栈的代码按预期工作。(Ic8807)
行为更改
- 深层链接模式现在在 NavDeepLink 中延迟编译,而不是在膨胀期间编译。这将改善包含深层链接的导航图的膨胀时间。(b8d257, b/184149935)
错误修复
- 修复了在将
NavHost
直接添加到活动的setContent()
中时,NavBackStackEntries 在移动到Lifecycle.State.STARTED
后会被推送到Lifecycle.State.CREATED
的问题。(Ia5ac1, b/203536683) - 修复了在对话框实际显示之前从回退栈中弹出
DialogFragment
目标时,实际上不会关闭对话框,从而导致用户手动关闭错误对话框时出现崩溃的竞争条件。(I687e5) - 修复了
NavigationUI
上的onNavDestinationSelected
API 即使您实际上没有navigate()
到该导航图也会返回true
的问题。它现在使用setupWithNavController
内部使用的相同逻辑,仅使用目标的hierarchy
选择与当前目标关联的MenuItem
。(I2b053)
版本 2.4.0-beta01
2021 年 10 月 27 日
androidx.navigation:navigation-*:2.4.0-beta01
已发布。版本 2.4.0-beta01 包含这些提交。
新功能
- 您现在可以使用
by navGraphViewModel
和路由作为使用 ID 的替代方法,以便更好地支持将 Navigation Kotlin DSL 与 Fragment 配合使用。(I901e3, b/201446416)
API 更改
visibleEntries
API 现在已处于实验阶段。(I93f6f)
错误修复
- 在通过在同一屏幕之间来回导航中断过渡时,ViewModel 将不再被销毁 (Id52d8, b/200817333)
- 可为空的
NavDeepLink
参数在将深层链接添加到NavDestination
时不再需要默认值。(I5aad4, b/201320030) - 具有不同生命周期的 NavBackStackEntries 不再被视为相等。这意味着在使用 singleTop 进行导航以及重新选择底部菜单项时,NavHost 将正确地重新组合所有目标。(I1b351, b/196997433)
- 修复了
AbstractListDetailFragment
中导致由onCreateListPaneView()
返回的列表窗格上的layout_width
和layout_weight
属性处理不当或被忽略的问题。(f5fbf3) - 对话框目标的视觉状态现在与
DialogFragmentNavigator
的状态保持同步。这意味着,手动调用DialogFragment
的异步dismiss()
API 现在将正确地清除所有位于现在已关闭的对话框之上的对话框目标。这不会影响您使用popUpTo
或popBackStack()
来关闭对话框的情况。(I77ba2) AbstractAppBarOnDestinationChangedListener
现在为onDestinationChanged()
提供更清晰的错误消息。(Ie742d)
版本 2.4.0-alpha10
2021 年 9 月 29 日
androidx.navigation:navigation-*:2.4.0-alpha10
已发布。版本 2.4.0-alpha10 包含这些提交。
新功能
- NavController 现在提供通过
visibleEntries
StateFlow 检索所有可见NavBackStackEntry
实例列表的功能 (Ia964e) rememberNavController()
现在接受一组可选的Navigator
实例,这些实例将被添加到返回的NavController
中,以便更好地支持可选的导航器,例如来自 Accompanist Navigation Material 的那些导航器。(I4619e)
错误修复
- 动态导航在活动被重新创建时将不再崩溃。(Ifa6a3, b/197942869)
- 修复了仅在弹出到包含
NavHost
的可组合目标后才会发生的系统后退按钮问题。(3ed148, b/195668143) - SafeArgs 现在以正确的参数顺序生成
fromBundle()
和fromSavedStateHandle()
的参数。(I824a8, b/200059831)
版本 2.4.0-alpha09
2021 年 9 月 15 日
androidx.navigation:navigation-*:2.4.0-alpha09
已发布。 版本 2.4.0-alpha09 包含以下提交。
新功能
- 您现在可以使用
clearBackStack()
方法清除使用popBackStack()
或popUpToSaveState
保存的任何状态。(I80a0f) - 您现在可以将参数列表和/或深层链接传递给嵌套导航图的构建器,它们将自动添加到生成的图中。(I8a470, b/182545357)
API 更改
navArgument
Kotlin DSL 函数现在是navigation-common
的一部分,而不是navigation-compose
。这将需要更新导入才能继续使用此函数。(I1d095)
行为更改
- 生成参数时,Safe Args 现在将没有默认值的参数放在有默认值的参数之前。(I89709, b/198493585)
错误修复
- 使用 Navigation Compose 时,NavGraphs 只有在所有子节点都
DESTROYED
后才会DESTROYED
。(I86552, b/198741720) - 可为空的
NavDeepLink
参数不再需要默认值。(Ia14ef, b/198689811) - 使用新图调用
setGraph()
现在除了之前的弹出回退栈行为外,还会清除任何保存的回退栈。(I97f96) - 修复了在使用
launchSingleTop
时OnDestinationChangedListener
实例和currentBackStackEntryFlow
未收到通知的问题。(Iaaebc)
依赖更新
- Navigation Compose 现在依赖于 Activity Compose 1.3.1。(I05829)
- Navigation Compose 现在依赖于 Lifecycle ViewModel Compose
2.4.0-beta01
。(Ib86a3)
版本 2.4.0-alpha08
2021 年 9 月 1 日
androidx.navigation:navigation-*:2.4.0-alpha08
已发布。 版本 2.4.0-alpha08 包含以下提交。
新功能
- 现在可以扩展
NavType
类来创建自定义 NavType。自定义类型仅在以编程方式构建导航图时受支持,例如通过 导航图 Kotlin DSL。(I78440, b/196871885)
行为更改
- 生成操作时,Safe Args 从 Safe Args 生成的 Kotlin 代码现在将没有默认值的参数放在有默认值的参数之前作为参数。(Idb697, b/188855904)
- 深层链接现在会验证所有必需参数(没有默认值的参数)是否存在于
Uri
中。(#204, b/185527157)
错误修复
- 在可组合函数中使用
getBackStackEntry
和previousBackStackEntry
,与remember()
结合使用,将不再对回退栈中没有目标产生异常。(I75138, b/194313238) - Navigation Compose 现在在更改回退栈参数并使用
launchSingleTop=true
时会正确地重新组合。(Iebd69, b/186392337) - 在使用具有 13 个或 29 个目标的图调用
setGraph
时,将不再出现ArrayIndexOutOfBoundsException
。(I1a9f1, b/195171984) - SafeArgs Java 生成器在生成 Args 类时应该不再导致 Lint 警告。(I1a666, b/185843837)
外部贡献
- 感谢 ospixd 确保深层链接验证所有必需参数(没有默认值的参数)是否存在于
Uri
中。(#204, b/185527157)
版本 2.4.0-alpha07
2021 年 8 月 18 日
androidx.navigation:navigation-*:2.4.0-alpha07
已发布。 版本 2.4.0-alpha07 包含以下提交。
错误修复
- Navigation Compose 现在在配置更改后以及在使用多个回退栈时更改图后会正确地保存状态。(If5a3d, b/195141957)
- 在使用多个回退栈的导航组合中重新选择同一选项卡将不再导致空白屏幕。(I860dc, b/194925622)
NavHost
现在观察NavBackStackEntry
的Lifecycle.State
的变化,这意味着在片段中使用NavHost
现在将根据生命周期变化正确地重新组合,而不是导致空白屏幕。(I4eb85, b/195864489)- 修复了关闭
DialogFragment
不会在重新创建活动后(即,配置更改后)正确更新NavController
状态的问题。(Icd72b) - 修复了弹出对话框目标不会更新 NavController 的系统后退按钮处理的问题,这可能会导致 NavController 拦截后退按钮,即使它没有任何回退栈要弹出。(If3b34)
- Safe-args 现在会自动为参数生成
toSavedStateHandle
方法,该方法可用于测试您的ViewModel
代码。(If1e2d, b/193353880)
版本 2.4.0-alpha06
2021 年 8 月 4 日
androidx.navigation:navigation-*:2.4.0-alpha06
已发布。 版本 2.4.0-alpha06 包含以下提交。
API 更改
AbstractListDetailFragment
上的requireSlidingPaneLayout()
和requireDetailPaneNavHostFragment()
方法已分别重命名为getSlidingPaneLayout()
和getDetailPaneNavHostFragment()
。(I34a08)
行为更改
- 在使用动画(如
Crossfade
)导航时,新目标的Lifecycle
现在只会在动画完成时达到RESUMED
状态。(If0543, b/172112072, b/194301889) - Navigation Compose 的
NavHost
现在将图设置为第一次组合的一部分。(Ieb7be)
错误修复
- 弹出导航图的最后一个目标不再抛出
ClassCastException
。(If0543, b/172112072, b/194301889) - 修复了在添加没有
Uri
的深层链接并通过路由或深层链接导航时发生的NullPointerException
。(938a0c, b/193805425) - 修复了 Navigation Compose 中深层链接的
NavBackStackEntry
不会达到RESUMED
状态的问题。(I192c5) - 修复了弹出对话框目标不会更新 NavController 的系统后退按钮处理的问题,这可能会导致 NavController 拦截后退按钮,即使它没有任何回退栈要弹出。(aosp/1782668)
版本 2.4.0-alpha05
2021 年 7 月 21 日
androidx.navigation:navigation-*:2.4.0-alpha05
已发布。 版本 2.4.0-alpha05 包含以下提交。
行为更改
- Navigation Compose 的
NavHost
现在在导航到目标时始终使用 Crossfades。(I07049, b/172112072) - 您现在可以更改 NavHost 的图。具有相同 startDestination 和图中目标的图将被视为相等,并且不会清除
NavController
回退栈。(I0b8db, b/175392262)
错误修复
- 修复了在从附加到
NavBackStackEntry
的LifecycleObserver
中调用popBackStack()
时发生的NoSuchElementException
,该异常是由对 NavController 状态的重入更新引起的。(I64621) AbstractListDetailFragment
现在允许在不使用AbstractListDetailFragment
时从 APK 中完全删除SlidingPaneLayout
。(I611ad)NavGraph
和NavDestination
现在覆盖了 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
目标。这些对话框目标将分别在 ComposableDialog
中显示,浮动在当前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
上的pushWithTransaction
和popWithTransition
API 来异步推送或弹出目的地。请注意,这些 API 尚未被任何包含的导航器使用。 (Ic4d7c, b/172112072)
行为更改
NavDeepLinkBuilder
现在将PendingIntent.FLAG_IMMUTABLE
添加到createPendingIntent()
返回的PendingIntent
,确保此 API 在以 Android 12 为目标时按预期工作。 (If8c52)
错误修复
- 修复了
<include-dynamic>
的问题,其中传递给图表的参数不会正确传递给动态包含的图表。 (I3e115) - 修复了使用
string[]
参数并具有@null
默认值的目的地导航时发生的NullPointerException
。 (I1fbe8) - 添加了
@Navigator.Name
的 ProGuard 规则,修复了使用 R8 3.1 全模式时的错误。 (I2add9, b/191654433) - SafeArgs 在使用
Kotlin
版本早于1.5.0
的情况下,构建您的应用程序时将不再失败。 (Icd1ff, b/190739257)
版本 2.4.0-alpha03
2021 年 6 月 16 日
androidx.navigation:navigation-*:2.4.0-alpha03
已发布。 版本 2.4.0-alpha03 包含这些提交。
错误修复
- 修复了需要两次
navigate()
调用才能导航到包含的动态图表的问题。 (I7785c, b/188859835) - 修复了 Navigation
2.4.0-alpha01
中引入的回归,其中setupActionBarWithNavController()
在您位于顶级目的地时不会正确删除向上图标。 (I5d443, b/189868637) - 修复了在先前弹出 NavController 的根图表后调用
popBackStack()
时的IllegalStateException
。 (I2a330, b/190265699) by navArgs()
的 ProGuard 规则现在在使用navigation-common
或任何依赖它的工件时都适用。 (I68800, b/190082521)- 首次收到回调时调用
navigate()
的OnDestinationChangedListener
现在将正确地获得第二个回调,并使用它导航到的目的地。 (Ie5f9e, b/190228815) - Safe Args 在与动态功能模块和 AGP 7.0+ 一起使用时,不再崩溃。 (I69518, b/189966576)
已知问题
- Safe Args 在使用 Gradle
6.7.0
时,由于依赖于旧版本的 Kotlin,将以Unable to find method ‘’java.lang.String kotlin.text.CarsKt.titleCase(char, java.util.Locale)’’
错误失败。可以通过更新为使用 Gradle 7.0 来解决此问题。 (b/190739257)
版本 2.4.0-alpha02
2021 年 6 月 2 日
androidx.navigation:navigation-*:2.4.0-alpha02
已发布。 版本 2.4.0-alpha02 包含这些提交。
新功能
- 路由现在支持 Activity、Fragment 和 Dialog 目的地,以及整个 DynamicNavigation Kotlin DSL。 (Ib5544, Ia617b, I22f96, b/188914648, b/188901565)
NavigationUI
暂时添加了实验性 API 来允许选择退出保存您的状态。虽然始终保存状态是正确的行为,但仍然存在一些使用已弃用库(即保留的 fragment)的情况,在保存状态时无法得到支持,因此这为应用程序提供了逐步从任何不受支持的 API 转换过来的机会。 (Idf93c)Navigation 现在提供了
findDestination()
和getHierarchy()
API,可以用来帮助实现自定义 NavigationUI。findDestination()
是NavGraph
上的扩展函数,将在图表中定位目的地。getHierarchy()
是NavDestination
上的函数,可用于验证给定目的地是否在另一个目的地的层次结构内。(I2932f, b/188183365)val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
接受
BottomNavigationView
的 NavigationUI 方法已更新为改用其在 Material1.4.0
中引入的超类NavigationBarView
。这允许这些方法与NavigationRailView
一起使用。 (Ib0b36, b/182938895)通过 XML 膨胀
<action>
元素时,动画属性可以使用从主题中提取的属性,使用app:enterAnim="?attr/transitionEnter"
语法。 (I07bc1, b/178291654)
API 更改
- 使用 ID 的 Kotlin DSL 生成器已弃用,应替换为使用路由的生成器 (I85b42, b/188816479) (I9f58f, b/188816479)
错误修复
DialogFragmentNavigator
现在使用NavigatorState.pop()
API 来通知NavController
,当对话框通过按下系统后退按钮或点击其外部而被关闭时,确保NavController
状态始终与 Navigator 的状态同步。 (I2ead9)Navigation 在使用
onDestinationChanged
回调中操作OnDestinationChangedListeners
列表时,不再出现ConcurrentModificationException
。 (Ib1707, b/188860458)Safe Args 在尝试在 Kotlin 中生成方向属性时不再崩溃。 (Id2416, b/188564435)
NavDestination 上的 setId 方法现在使用
@IdRes
正确地进行注释,因此它只接受资源 ID。 (I69b80)findNode
的 int 参数现在是resId
而不是resid
。 (I7711d)
依赖项更新
- Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。这意味着您现在应该不再收到使用
applicationIdTextResource
的警告。 (I6d67b, b/172824579)
版本 2.4.0-alpha01
2021 年 5 月 18 日
androidx.navigation:navigation-*:2.4.0-alpha01
已发布。 版本 2.4.0-alpha01 包含这些提交。
新功能
NavController
上的currentBackStackEntryAsFlow()
方法提供了一个Flow
,它在当前NavBackStackEntry
发生更改时发出。此 flow 可用作手动管理OnDestinationChangedListener
的替代方案。 (I19c4a, #89, b/163947280)
多个后退栈
NavController
负责管理目的地的后退堆栈,当您 navigate()
到它们时将目的地添加到后退堆栈,当您调用 popBackStack()
或触发系统后退按钮时将其移除。现有的 NavOptions
类以及与导航图 XML 中的 <action>
条目的集成已被扩展为支持保存和还原后退堆栈。 (b/80029773)
作为此更改的一部分,NavigationUI
的 onNavDestinationSelected()
、BottomNavigationView.setupWithNavController()
和 NavigationView.setupWithNavController()
方法现在会自动保存和还原弹出目的地的状态,从而支持多个后退堆栈,而无需任何代码更改。在使用 Navigation 与 Fragment 时,这是与多个后退堆栈集成的推荐方法。 (Ie07ca)
用于保存和恢复状态的基础 API 通过多个表面公开
在 Navigation XML 中,
<action>
元素现在可以使用app:popUpToSaveState
和app: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>
目的地的 FragmentNavigator
和 DynamicFragmentNavigator
都已更新为使用新的 Navigator API 并支持保存和还原状态。
Navigation 路由
路由 是一个 String
,它唯一地标识目的地。虽然以前只在 Navigation Compose 中使用,但现在这个概念已升级为成为核心 Navigation API 的一部分。这为在通过 Navigation Kotlin DSL 构建图表时使用整型 ID 提供了一种替代方法。 (b/172823546)
以前仅接受 ID 的所有 API 现在都有一个接受路由 String
的重载。 这包括 navigate()
、popBackStack()
、popUpTo()
和 getBackStackEntry()
。
这对 API 造成了一些影响
- Kotlin DSL 上的
popUpTo
kotlin 属性已被弃用,取而代之的是popUpToId
。 (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) - 现在,
NamedNavArgument
的name
和argument
字段和解构函数是公开的。 (#174,b/181320559) - 引入了一个新的
NavBackStackEntry#provideToCompositionLocals
扩展,该扩展将NavBackStackEntry
提供给相关的组合局部变量。 (#175,b/187229439)
安全参数
Safe Args 现在为每个
NavArgs
类生成一个fromSavedStateHandle()
方法。 (#122, b/136967621)class HomeViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { // Create a HomeDestinationArgs class with type safe accessors for each argument // defined on your destination private val args = HomeDestinationArgs.fromSavedStateHandle(savedStateHandle) }
更新 Safe Args 以依赖于 KotlinPoet
1.8.0
。 (#172,b/183990444)
行为更改
- Navigation 现在依赖于 Lifecycle
2.3.1
,并将更新NavBackStackEntry
Lifecycle
的方法(如setGraph()
、popBackStack()
、navigateUp()
和navigate()
)标记为@MainThread
,使 Navigation 与 Lifecycle2.3.0
中引入的主线程强制执行相一致。 (b/171125856) - 现在解析来自深度链接的枚举参数时不区分大小写,允许像
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")
的自定义导航器。 (Ib1c2c,b/175979140)- 改进了
NavigatorProvider#addNavigator
的行为,以确保重复使用相同实例调用它不会导致问题。 (#176,b/187443146)
外部贡献
- 感谢 simonschiller 为 Safe Args 构建了对为每个
NavArgs
类生成fromSavedStateHandle()
方法的支持。 (#122,b/136967621) - 感谢 Bradleycorn 使解析来自深度链接的枚举参数时不区分大小写。 (#152,b/135857840)
- 感谢 osipxd 修复了一个问题,即尾随参数占位符会优先于具有匹配完全后缀的深度链接。 (#153,b/184072811)
- 感谢 tatocaster 更新 Safe Args 以依赖于 KotlinPoet
1.8.0
。 (#172,b/183990444) - 感谢 jossiwolf 使
NamedNavArgument
的name
和argument
字段和解构函数成为公开的。 (#174,b/181320559) - 感谢 jossiwolf 引入了一个新的
NavBackStackEntry#provideToCompositionLocals
扩展,该扩展将NavBackStackEntry
提供给相关的组合局部变量。 (#175,b/187229439) - 感谢 jossiwolf 改进了
NavigatorProvider#addNavigator
的行为,以确保重复使用相同实例调用它不会导致问题。 (#176,b/187443146)
Navigation Compose 版本 1.0.0
版本 1.0.0-alpha10
2021 年 4 月 7 日
androidx.navigation:navigation-compose:1.0.0-alpha10
已发布。 版本 1.0.0-alpha10 包含这些提交。
API 更改
NavHost
现在接受一个Modifier
,该Modifier
会传递给包装目的地可组合的的可组合容器。 (I85aca,b/175125483)
错误修复
NavHost
现在即使在找不到OnBackPressedDispatcherOwner
的情况下也能正常工作,例如在预览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 包含这些提交。
依赖更新
- Navigation Compose 现在依赖于 Lifecycle ViewModel Compose 1.0.0-alpha01 为
composable
目标提供viewModel()
支持。 (I7a374) NavHost
现在使用来自 Activity-Compose 1.3.0-alpha01 的新的LocalOnBackPressedDispatcherOwner
来获取设置在NavController
上的OnBackPressedDispatcher
。 (I65b12)
版本 1.0.0-alpha06
2021 年 1 月 28 日
androidx.navigation:navigation-compose:1.0.0-alpha06
已发布。 版本 1.0.0-alpha06 包含这些提交。
API 更改
- 在
NavController
上添加了一个getBackStackEntry(route: String)
扩展方法,该方法返回关联的NavBackStackEntry
。 (If8931)
版本 1.0.0-alpha05
2021 年 1 月 13 日
androidx.navigation:navigation-compose:1.0.0-alpha05
已发布。 版本 1.0.0-alpha05 包含这些提交。
更新以依赖于 Compose 1.0.0-alpha10。
版本 1.0.0-alpha04
2020 年 12 月 16 日
androidx.navigation:navigation-compose:1.0.0-alpha04
已发布。 版本 1.0.0-alpha04 包含这些提交。
- 更新以与 Compose
1.0.0-alpha09
兼容。
版本 1.0.0-alpha03
2020 年 12 月 2 日
androidx.navigation:navigation-compose:1.0.0-alpha03
已发布。 版本 1.0.0-alpha03 包含这些提交。
错误修复
- 修复了在配置更改或进程死亡和重新创建后,
popBackStack()
和navigateUp()
不起作用的问题。 (Icea47, b/173281473) - 现在可以在 NavHost 中正确地导航到嵌套的图。 (I0948d, b/173647694)
版本 1.0.0-alpha02
2020 年 11 月 11 日
androidx.navigation:navigation-compose:1.0.0-alpha02
已发布。 版本 1.0.0-alpha02 包含这些提交。
API 更改
- 导航 Compose 现在支持 NavOptions,用于执行 popUpTo 和 launchSingleTop 操作。 (If96c3, b/171468994)
- 添加了一个导航函数,该函数接受一个路由而不是一个 ID,允许您在 Navigation Compose DSL 中构建嵌套图。 (I1661d)
- startDestination 现在出现在 NavHost 参数列表中的路由之前。 (Ie620e)
- 您现在可以使用路由作为起点,在 NavHost 可组合之外创建图。 (Iceb75)
版本 1.0.0-alpha01
2020 年 10 月 28 日
android.navigation:navigation-compose:1.0.0-alpha01
已发布。 版本 1.0.0-alpha01 包含这些提交。
新功能
navigation-compose
工件提供了 Navigation 组件 和 Jetpack Compose 之间的集成。它使用 @Composable
函数作为应用程序中的目标。
此初始版本提供以下内容:
- 一个
NavHost
可组合,允许您通过 Kotlin DSL 构建导航图。 - 在目的地级别对生命周期、
ViewModel
和记住的状态进行范围限定。 - 与系统后退按钮的自动集成。
- 支持传递参数、将深度链接附加到目标以及将结果返回到以前的目标。
- Compose 中的特定帮助程序,例如
rememberNavController()
和currentBackStackEntryAsState()
,用于允许 提升状态 并将NavController
连接到NavHost
之外的可组合对象(例如底部导航栏)。
有关更多信息,请参阅 Compose 导航指南。
版本 2.3.5
版本 2.3.5
2021 年 4 月 7 日
androidx.navigation:navigation-*:2.3.5
已发布。 版本 2.3.5 包含这些提交。
新功能
- 使用
NavDeepLinkRequest
或Uri
导航时,您现在可以通过KEY_DEEP_LINK_INTENT
从参数中获取意图,在结果目的地中访问Uri
、操作和 MIME 类型,这与外部深层链接中已有的功能相呼应。 (I975c3, b/181521877)
错误修复
- 在 Activity 生命周期处于
STOPPED
状态,然后处于STARTED
状态时,使用NavBackStackEntry
作为 LifecycleOwner 添加到调度程序的OnBackPressedCallbacks
现在可以正确地拦截返回。 (Iff94f, b/182284739) - 深层链接域解析现在不区分大小写,确保
www.example.com
与www.example.com
和www.Example.com
都匹配。请注意,查询参数名称仍然区分大小写。 (#144, b/153829033) - 修复了当目的地具有多个非空默认参数并且您导航到该目的地时仅覆盖这些参数的子集时可能出现的
NullPointerException
。 (aosp/1644827)
依赖更新
- Navigation Safe Args Gradle 插件现在依赖于 Kotlin Gradle 插件 1.4.31。 (aosp/1661058, b/181156413)
外部贡献
- 感谢
bentrengrove
的拉取请求,使深层链接域解析不区分大小写。 (#144, b/153829033)
版本 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)
- 现在使用已设置的相同对象调用
setViewModelStore
或setLifecycleOwner
将是无操作的。 (Idf491, b/177825470) - Safe-Args 现在在使用 Java 时在正确的方法上添加抑制注释。 (I8fbc5, b/179463137)
外部贡献
- 感谢
JvmName
的拉取请求,以确保ReferenceType
参数现在可以在作为深层链接 URI 的一部分发送时正确解析。 (#127, b/179166693) - 感谢
tatocaster
的拉取请求,允许具有app:argType=”float”
的参数的defaultValue
现在支持整数默认值。 (#117, b/173766247)
版本 2.3.3
版本 2.3.3
2021 年 1 月 27 日
androidx.navigation:navigation-*:2.3.3
已发布。 版本 2.3.3 包含这些提交。
错误修复
- 在将
NavBackStackEntry
的Lifecycle
移动到CREATED
之前弹出它时不再会崩溃。 (Ie3ba3) - 修复了由 b/171364502 引起的回归,其中导航到具有
0
的动画资源值的活动会导致ResourceNotFoundException
。 (I7aedb, b/176819931)
版本 2.3.2
版本 2.3.2
2020 年 12 月 2 日
androidx.navigation:navigation-*:2.3.2
已发布。 版本 2.3.2 包含这些提交。
错误修复
- 修复了
NavigationUI
中的回归,其中使用具有onNavDestinationSelected
的<activity>
目的地将无法导航到活动。 (I22e34, b/171364502) - 修复了
navigation-dynamic-features-fragment
会导致多次导航到新安装的目的地的问题。 (aosp/1486056, b/169636207) - 修复了在使用
launchSingleTop
时,默认参数不会发送到OnDestinationChangedListener
实例的问题。 (I2c5cb) - 修复了导航到嵌套导航图不会在后退栈中创建新图实例的问题。 (Ifc831)
- 修复了使用
navigate()
和popUpTo
(它删除了导航图中的最后一个目的地)不会立即销毁并从后退栈中删除导航图本身的问题。 (I910a3) - Navigation Safe Args 现在使用 KotlinPoet 版本 1.7.2,该版本增加了对 Kotlin 的显式 API 模式的支持。 (I918b5)
NavHostFragment.findNavController(Fragment)
现在除了对 Fragment 层次结构和 Fragment 的视图层次结构的现有检查外,还检查对话框片段的根装饰视图。这使您可以使用FragmentScenario
和Navigation.setViewNavController()
测试使用 Navigation 的对话框片段。 (I69e0d)
版本 2.3.1
版本 2.3.1
2020 年 10 月 14 日
androidx.navigation:navigation-*:2.3.1
已发布。 版本 2.3.1 包含这些提交。
新功能
- 默认动画程序资源已添加到 Navigation UI,建议使用它们而不是默认动画资源。 (b/167430145)
- NavOptions 现在覆盖了哈希码和 equals 方法。 (b/161586466)
- Navigation 现在在“没有 ID 为”的 IllegalArgumentException 中包含当前目的地,这应该可以改善开发人员的调试体验。 (b/168311416)
错误修复
- Safe Args 将不再换行,即使生成的 arguments 类名称超过 100 个字符也是如此。 (b/168584987)
依赖项更改
navigation-ui
现在依赖于 DrawerLayout 1.1.1,确保即使使用LOCK_MODE_LOCKED_CLOSED
或LOCK_MODE_LOCKED_OPEN
,NavigationUI
也能打开抽屉。 (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-runtime
和navigation-dynamic-features-fragment
工件允许您导航到功能模块中定义的目的地,并根据需要自动处理功能模块的安装。有关更多信息,请参阅 使用功能模块导航。 - 导航测试:
navigation-testing
工件提供了一个TestNavHostController
,它允许您设置当前目标并验证导航操作后的回退栈。有关更多信息,请参阅 测试导航。 - 返回结果: 现在,与导航回退栈上的每个目标关联的
NavBackStackEntry
允许您访问一个SavedStateHandle
,该SavedStateHandle
适合存储应与特定回退栈条目关联的小量保存状态。有关更多信息,请参阅 将结果返回到前一个目标。 NavigationUI
对Openable
的支持:NavigationUI
中所有对DrawerLayout
的使用都已替换为更通用的Openable
接口,该接口在 CustomView1.1.0
中添加,并由DrawerLayout
在 DrawerLayout1.1.0
中实现。- 深层链接中的操作和 MIME 类型支持: 深层链接已扩展为除了以前可用的
app:uri
之外,还支持app:action
和app:mimeType
。NavController
现在通过新的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 包含这些提交。
错误修复
- 修复了
NavBackStackEntry
的Lifecycle
在进程死亡后不会正确更新的问题。(b/155218371) - 现在,在调用
setGraph()
之前注册的OnDestinationChangedListener
实例将在进程死亡后正确地收到已恢复的目标。(b/155218371) - 使用
singleTop
时,NavBackStackEntry
现在会正确更新其参数,并且更新后的参数会发送到所有OnDestinationChangedListener
实例。(b/156545508)
依赖更新
NavigationUI
工件现在依赖于 CustomView1.1.0-rc01
和 DrawerLayout1.1.0-rc01
。(aosp/1309696)
版本 2.3.0-alpha06
2020 年 4 月 29 日
androidx.navigation:navigation-*:2.3.0-alpha06
已发布。(版本 2.3.0-alpha06 包含这些提交。)
新功能
- 深层链接已扩展为除了以前可用的
app:uri
之外,还支持app:action
和app: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) - 导航图 Kotlin DSL 现在公开了用于操作的
defaultArguments
Map
,镜像了在导航 XML 文件中为<action>
元素设置默认值的能力。(b/150345605)
错误修复
- 从 Navigation 2.2.2 开始:修复了在活动中有多个
NavHostFragment
实例时,深层链接到图的启动目标时发生的IllegalStateException
。(b/147378752)
依赖项更新
- Navigation 现在依赖于 Fragment
1.2.4
。(aosp/1277325) - 动态导航现在依赖于 Play Core
1.7.2
。(aosp/1282257)
版本 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 更改
AppBarConfiguration
不再依赖于具体的DrawerLayout
类,而是使用在 CustomView1.1.0-alpha02
中引入的Openable
接口(截至 DrawerLayout1.1.0-alpha04
,DrawerLayout
实现了该接口),这使您可以将Openable
的自定义实现与NavigationUI
一起使用。(b/129030452)
错误修复
navigation-common-ktx
ProGuard 规则现在会正确地仅保留使用的NavArgs
类,而不是所有NavArgs
实例。(b/150213558)
依赖项更改
- Navigation 已将其对 Core
1.2.0
的依赖项恢复,现在依赖于 Core1.1.0
,以避免在 Navigation 不依赖于 Core1.2.0
中的任何新 API 时,强制开发人员迁移到较新的依赖项。
版本 2.3.0-alpha02
2020 年 2 月 19 日
androidx.navigation:navigation-*:2.3.0-alpha02
已发布。 版本 2.3.0-alpha02 包含这些提交。
新功能
NavBackStackEntry
现在允许您访问一个SavedStateHandle
,该SavedStateHandle
适合存储应与特定回退栈条目关联的小量保存状态。有关示例用例,请参阅 返回结果。(b/79672220)
API 更改
- 已添加
getCurrentBackStackEntry()
和getPreviousBackStackEntry()
的便捷方法,以便更轻松地检索当前目标和前一个目标的NavBackStackEntry
。(b/79672220)
错误修复
navigateUp()
现在会在您自己的任务栈上启动应用程序时,将当前目标的参数和KEY_DEEP_LINK_INTENT
传递给前一个目标。(b/147456890)
依赖项更改
- Navigation 现在依赖于 Core
1.2.0
。
版本 2.3.0-alpha01
2020 年 2 月 5 日
androidx.navigation:navigation-*:2.3.0-alpha01
已发布。 版本 2.3.0-alpha01 包含这些提交.
新功能
- 新的
navigation-testing
工件提供了TestNavHostController
类。当 测试导航 时,该类提供了对使用模拟NavController
的替代方法,它允许您设置当前目标并验证导航操作后的回退栈。(b/140884273) - 新的
navigation-dynamic-features-fragment
(及其传递依赖项navigation-dynamic-features-runtime
)允许您从 功能模块 中包含目标或整个导航图(通过<include-dynamic>
),在导航到这些目标时提供对按需功能模块的无缝安装。有关更多信息,请参见 使用功能模块导航。(b/132170186)
错误修复
- 从 Navigation
2.2.1
开始:没有查询参数的深层链接现在会正确地忽略任何查询参数,而不是将它们追加到尾部的{argument}
元素或不匹配深层链接。(b/147447512) - 从 Navigation
2.2.1
开始:navigation-ui
的 ProGuard 规则已更新,以确保DrawerArrowDrawable
不再需要android.enableJetifier=true
。(b/147610424) - 从 Navigation
2.2.1
开始:navigation-common-ktx
模块现在具有唯一的清单包名称,而不是与navigation-runtime-ktx
共享相同的清单包名称。(aosp/1141947)
依赖项更新
- 从 Navigation
2.2.1
开始:Navigation2.2.1
现在依赖于 Lifecycle ViewModel SavedState2.2.0
和 Fragment1.2.1
。
版本 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)
依赖项更新
- Navigation 现在依赖于 Fragment
1.2.4
。(aosp/1277325)
版本 2.2.1
版本 2.2.1
2020 年 2 月 5 日
androidx.navigation:navigation-*:2.2.1
已发布。 版本 2.2.1 包含这些提交。
错误修复
- 没有查询参数的深层链接现在会正确地忽略任何查询参数,而不是将它们追加到尾部的
{argument}
元素或不匹配深层链接。(b/147447512) navigation-ui
的 ProGuard 规则已更新,以确保DrawerArrowDrawable
不再需要android.enableJetifier=true
。(b/147610424)navigation-common-ktx
模块现在具有唯一的清单包名称,而不是与navigation-runtime-ktx
共享相同的清单包名称。(aosp/1141947)
依赖项更新
- Navigation
2.2.1
现在依赖于 Lifecycle ViewModel SavedState2.2.0
和 Fragment1.2.1
。
版本 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 驱动的LifecycleOwner
、ViewModelStoreOwner
(与NavController.getViewModelStoreOwner()
返回的值相同)和SavedStateRegistryOwner
,此外还提供了用于启动该目标的参数。 - Lifecycle ViewModel SavedState 集成:
SavedStateViewModelFactory
现在是使用by navGraphViewModels()
或使用NavController.getBackStackEntry()
或NavController.getViewModelStoreOwner()
返回的ViewModelStoreOwner
的ViewModelProvider
构造函数时使用的默认工厂。 - 对深层链接的查询参数支持:具有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可为空的参数在匹配深层链接时现在是可选的。
- 改进的动画支持:
NavHostFragment
现在使用 Fragment 1.2.0 中的FragmentContainerView
,修复了动画 z 顺序问题以及窗口内边距调度到 Fragment 的问题。
版本 2.2.0-rc04
2019 年 12 月 18 日
androidx.navigation:navigation-*:2.2.0-rc04
已发布。 版本 2.2.0-rc04 包含这些提交。
错误修复
- 调整了
navigation-ui
使用的默认淡入淡出动画,使其与 Fragment1.2.0-rc04
中调整的淡入淡出动画匹配。(b/145769814)
版本 2.2.0-rc03
2019 年 12 月 4 日
androidx.navigation:navigation-*:2.2.0-rc03
已发布。 版本 2.2.0-rc03 包含这些提交。
错误修复
- 修复了使用查询参数和作为路径最后部分的参数时,深层链接解析出现的问题,该问题阻止解析最终路径参数中的多个字符。(b/144554689)
- 修复了深层链接解析中出现的问题,其中可选参数将接收
"@null"
而不是null
。(b/141613546) NavHostFragment
现在可以在使用FragmentContainerView
时,在配置更改后正确地恢复图。(b/143752103)
依赖项更改
- Navigation 现在依赖于 Lifecycle
2.2.0-rc03
、Lifecycle ViewModel SavedState1.0.0-rc03
、Activity1.1.0-rc03
和 Fragment1.2.0-rc03
(在适当的情况下)。
版本 2.2.0-rc02
2019 年 11 月 7 日
androidx.navigation:navigation-*:2.2.0-rc02
已发布。 版本 2.2.0-rc02 包含这些提交。
依赖项更改
- Navigation 现在依赖于 androidx.lifecycle
2.2.0-rc02
。
版本 2.2.0-rc01
2019 年 10 月 23 日
androidx.navigation:navigation-*:2.2.0-rc01
已发布,自 2.2.0-beta01
以来没有任何更改。 版本 2.2.0-rc01 包含这些提交。
版本 2.2.0-beta01
2019 年 10 月 9 日
androidx.navigation:navigation-*:2.2.0-beta01
已发布。 版本 2.2.0-beta01 包含这些提交。
新功能
NavDestination
及其子类现在覆盖了toString()
,以便在调试时提供更有用的信息。(b/141264986)
行为变更
- 匹配深层链接时,现在会忽略额外的查询参数,而不是导致匹配失败。(b/141482822)
错误修复
- 修复了深层链接路径中的参数在也指定了查询参数时会被忽略的问题。(b/141505755)
Activity
上的navArgs()
Kotlin 扩展现在在没有附加信息时具有更好的错误消息。(b/141408999)- Safe Args 生成的
Directions
Java 类现在包含默认值。(b/141099045) - Safe Args 生成的
Args
Java 类现在包含默认值。(b/140123727) - 在使用
Toolbar
时,NavigationUI
不再在顶级目标之间移动时为文本更改设置动画。(b/140848160)
版本 2.2.0-alpha03
2019 年 9 月 18 日
androidx.navigation:navigation-*:2.2.0-alpha03
已发布。 版本 2.2.0-alpha03 包含这些提交。
行为变更
- 在调用
setGraph
之后调用setViewModelStore()
现在会导致IllegalStateException
。这应该始终由NavHost
作为初始设置的一部分进行设置,以确保所有NavBackStackEntry
实例都具有用于ViewModel
实例的一致存储。(aosp/1111821)
错误修复
- 修复了使用附加到多个不同导航图作用域的
ViewModelStore
实例的ViewModel
实例时出现的ConcurrentModificationException
。(aosp/1112257)
版本 2.2.0-alpha02
2019 年 9 月 5 日
androidx.navigation:navigation-*:2.2.0-alpha02
已发布。此版本中包含的提交可以找到 这里。
新功能
- 具有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可为空的参数在匹配深层链接时现在是可选的。(b/133273839)
- 您现在可以调用
NavController.getBackStackEntry()
,传入后退栈中目标或导航图的 ID。返回的NavBackStackEntry
提供了 Navigation 驱动的LifecycleOwner
、ViewModelStoreOwner
(与NavController.getViewModelStoreOwner()
返回的值相同)和SavedStateRegistryOwner
,此外还提供了用于启动该目标的参数。(aosp/1101691、aosp/1101710)
错误修复
- 修复了将
NavHostFragment
添加到ViewPager2
时出现IllegalArgumentException
问题。(b/133640271) NavInflater
现在避免不必要地调用getResourceName()
,将膨胀时间最多提高 40%。(b/139213740)
版本 2.2.0-alpha01
2019 年 8 月 7 日
androidx.navigation:navigation-*:2.2.0-alpha01
已发布。此版本包含的提交可以找到 此处。
新功能
SavedStateViewModelFactory
现在是使用by navGraphViewModels()
或使用ViewModelProvider
构造函数时使用的默认工厂,该构造函数使用NavController.getViewModelStoreOwner()
返回的ViewModelStoreOwner
。(b/135716331)
API 变更
- 从 Navigation
2.1.0-rc01
开始:在2.1.0-alpha02
中引入的NavController
上已弃用的getViewModelStore()
API 已被移除。(aosp/1091021)
错误修复
NavHostFragment
现在使用FragmentContainerView
,修复了动画 z 顺序问题以及窗口内边距分派给 Fragment 的问题。(b/137310379)
版本 2.1.0
版本 2.1.0
2019 年 9 月 5 日
androidx.navigation:navigation-*:2.1.0
已发布。此版本包含的提交可以找到 此处。
自 2.0.0 以来重要变更
- 将 ViewModel 范围限定到导航图:现在,您可以使用
by navGraphViewModels()
属性委托 (针对使用-ktx
库的 Kotlin 用户) 或使用添加到NavController
的getViewModelStoreOwner()
API 创建在导航图级别限定范围的 ViewModel。有关更多信息,请参阅 在目标之间共享与 UI 相关的数椐。 - 对话框目标:现在,您可以创建
<dialog>
目标,这些目标将在您navigate
到它们时显示DialogFragment
。NavHostFragment
默认情况下支持对话框目标。有关更多信息,请参阅 从 DialogFragment 创建目标。 - 通过 URI 导航:现在,您可以使用
Uri
navigate
,该 URI 将使用您添加到目标的<deepLink>
导航到该位置。有关更多信息,请参阅 使用 URI 导航。 - NavHostController:专门用于构造自定义
NavHost
的 API 已移至NavHostController
,允许实现将它们的NavController
连接到托管的LifecycleOwner
、OnBackPressedDispatcher
和ViewModelStore
。
版本 2.1.0-rc01
2019 年 8 月 7 日
androidx.navigation:navigation-*:2.1.0-rc01
已发布。此版本包含的提交可以找到 此处。
API 变更
- 在
2.1.0-alpha02
中引入的NavController
上已弃用的getViewModelStore()
API 已被移除。(aosp/1091021)
版本 2.1.0-beta02
2019 年 7 月 19 日
androidx.navigation:*:2.1.0-beta02
已发布。此版本包含的提交可以找到 此处。
错误修复
- 已删除在
2.1.0-beta01
中意外引入的 jacoco 依赖项。(b/137782950)
版本 2.1.0-beta01
2019 年 7 月 17 日
androidx.navigation:*:2.1.0-beta01
已发布。此版本包含的提交可以找到 此处。
新功能
NavigationUI
现在会在使用setupWithNavController()
与Toolbar
或CollapsingToolbarLayout
时为向上按钮的移除设置动画。(b/131403621)
错误修复
- 修复了在使用多个具有相同容器的 NavHostFragment 与
findNavController()
时发生的计时问题。(b/136021571)
版本 2.1.0-alpha06
2019 年 7 月 2 日
androidx.navigation:*:2.1.0-alpha06
已发布。此版本包含的提交可以找到 此处。
新功能
- NavHostFragment 使用的
app:navGraph
属性现在已移至navigation-runtime
工件。可以通过 XML 添加的自定义导航器应使用此属性来获得与导航编辑器的主机面板的集成。(b/133880955)
API 变更
NavController
上的getViewModelStore()
API 已被弃用,取而代之的是新的getViewModelStoreOwner()
方法,该方法返回ViewModelStoreOwner
。(aosp/987010)- 浮动窗口目标的实现(例如
<dialog>
目标)已推广到标记接口FloatingWindow
中,所有<dialog>
目标现在都实现了该接口。与应用栏顶部的交互的 NavigationUI 方法现在将忽略FloatingWindow
目标。(b/133600763)
行为变更
- Navigation 现在会在使用
<dialog>
目标时将自身状态与屏幕上看到的内容保持同步。因此,Navigation 现在会在您导航到非对话框和非活动目标(例如<fragment>
目标)时自动弹出<dialog>
目标。(b/134089818)
错误修复
- Navigation 现在会在处理深层链接时抑制在重新创建活动时发生的动画,从而修复了视觉闪烁问题。(b/130362979)
- 修复了 Navigation 后退堆栈在弹出 Fragment 作为初始 Fragment 正在添加时不同步的错误。(b/133832218)
版本 2.1.0-alpha05
2019 年 6 月 5 日
androidx.navigation:*:2.1.0-alpha05
已发布。此版本包含的提交可以找到 此处。
API 变更
NavController
上与主机相关的 API 已重命名并移至NavController
的新子类NavHostController
中。(aosp/966091)NavController
的setHostOnBackPressedDispatcherOwner()
方法已替换为NavHostController
的setOnBackPressedDispatcher()
方法,并且现在要求您在调用它之前调用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
,修复了 Navigation2.1.0-alpha03
中的回归。 b/132077777DialogFragmentNavigator
现在可以正确处理popBackStack()
和navigateUp()
操作。 b/132576764- 修复了在反复在嵌套图之间导航时发生的
IllegalStateException: unknown destination during restore
问题。 b/131733658
版本 2.1.0-alpha03
2019 年 5 月 7 日
androidx.navigation:*:2.1.0-alpha03
已发布。此版本包含的提交可以找到 此处。
已知问题
- 尽管使用
app:defaultNavHost="false"
,NavHostFragment 仍然会拦截系统后退按钮 b/132077777
新功能
- 现在,您可以创建
<dialog>
目标,这些目标将在您navigate
到它们时显示DialogFragment
。NavHostFragment
默认情况下支持对话框目标。 b/80267254 - 除了使用资源 ID 或
NavDirections
实例调用navigate
之外,现在还可以通过Uri
进行导航,该 URI 将使用您添加到目标的<deepLink>
导航到正确的位置。 b/110412864
行为变更
- NavigationUI 提供的默认动画已从 400 毫秒加快到 220 毫秒,以匹配活动和 Fragment 的默认动画速度。 b/130055522
API 变更
NavHostFragment
的createFragmentNavigator()
方法已弃用,其功能已移至新的onCreateNavController()
方法,以更清楚地表明这是在子类化NavHostFragment
时添加自定义导航器的正确入口点。 b/122802849- 已向
NavDestination
添加了一个hasDeepLink()
方法,允许您检查给定的Uri
是否可以由该目标处理,或者在NavGraph
的情况下,是否可以由导航图中的任何目标处理。 b/117437718
错误修复
- 默认参数现在已正确传递给
OnDestinationChangedListener
实例。 b/130630686 NavHostFragment
现在使用OnBackPressedDispatcher
拦截系统后退事件,修复了在 Fragment 生命周期方法中返回到 Fragment 时执行条件导航时出现的问题。 b/111598096- 对于 Safe Args,
android:defaultValue=”@null”
具有未指定的app:argType
现在已正确推断为string
参数。 b/129629192
版本 2.1.0-alpha02
2019 年 4 月 3 日
androidx.navigation:*:2.1.0-alpha02
已发布。此版本包含的提交可以找到 此处。
新功能
- 现在,您可以通过
by navGraphViewModels()
属性委托 (针对 Kotlin 用户) 或使用添加到NavController
的getViewModelStore()
API 创建在导航图级别限定范围的 ViewModel。 b/111614463
API 变更
- 现在,您可以向
<activity>
目标添加一个app:targetPackage
来限制匹配的包名。它支持app:targetPackage="${applicationId}"
来将包限制为您的应用程序 ID。 b/110975456
错误修复
- 用于
<activity>
目标的android:name
现在不再在膨胀时解析为类,从而在使用动态功能时防止 ClassNotFoundExceptions。 b/124538597
版本 2.1.0-alpha01
2019 年 3 月 19 日
这是 Navigation 2.1.0
的第一个 alpha 版本。
依赖项更改
- Navigation 现在依赖于
androidx.core:core:1.0.1
和androidx.fragment:fragment:1.1.0-alpha05
。此版本还删除了对androidx.legacy:legacy-support-core-utils:1.0.0
的依赖。 b/128632612
API 更改
- 添加了一个新的
Navigation.createNavigateOnClickListener(NavDirections)
方法,作为使用资源 ID 和 Bundle 创建点击监听器的替代方法。 b/127631752 FragmentNavigator.instantiateFragment
现在已弃用。默认实现现在使用FragmentFactory
来实例化 Fragment。 b/119054429
错误修复
- Navigation 在目标附加了参数时不再发送空
Bundle
,修复了在使用android:defaultValue="@null"
时出现的问题。 b/128531879 - Safe Args 现在依赖于 KotlinPoet 1.1.0,修复了极长包名出现的问题。 b/123654948
版本 2.0.0
版本 2.0.0
2019 年 3 月 14 日
Navigation 2.0.0
发布,与 2.0.0-rc02
相比没有变化。
版本 2.0.0-rc02
2019 年 3 月 6 日
Navigation 2.0.0-rc02 提供了使用 androidx.navigation
组 ID 的新工件,并将它的依赖项更改为 AndroidX 等效项。
2.0.0-rc02 的行为与 Navigation 1.0.0-rc02 的行为相同,除了更新依赖项以匹配 新依赖项 之外,您无需对代码进行任何更改即可从 1.0.0-rc02 更新。
您的项目必须已 迁移到 AndroidX 才能使用 Navigation 的 2.X 版本。Navigation 1.0 稳定版将是使用 Support Library 依赖项的最后一个版本;1.0 之后的任何未来开发都将基于 AndroidX 并建立在 2.0 稳定版的基础上。
预 AndroidX 依赖项
对于 Navigation 的预 AndroidX 版本,请包含这些依赖项
dependencies {
def nav_version = "1.0.0"
implementation "android.arch.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
implementation "android.arch.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
}
对于 Safe args,在您的 顶层 build.gradle
文件中添加以下 classpath
buildscript {
repositories {
google()
}
dependencies {
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
}
}
版本 1.0.0
版本 1.0.0
2019 年 3 月 14 日
Navigation 1.0.0
发布,与 1.0.0-rc02
相比没有变化。
版本 1.0.0-rc02
2019 年 2 月 26 日
这是 Navigation 1.0.0 稳定版发布的第二个候选版本。此版本包含许多错误修复。
错误修复
- 修复了如果根图没有 ID,
popBackStack()
将被忽略的问题。 b/126251695 navigateUp()
现在在处理没有FLAG_ACTIVITY_NEW_TASK
的深层链接后调用时,会正确地处理导航回您的应用程序的任务。 b/126082008- 修复了
ActivityNavigator.applyPopAnimationsToPendingTransition
未应用正确的弹出退出动画的问题。 b/126237567 - Safe Args 生成的 Kotlin 代码现在会正确地转义 Kotlin 关键字(如
in
和fun
),这些关键字位于与R
类关联的包名中。 b/126020455
版本 1.0.0-rc01
2019 年 2 月 21 日
这是 Navigation 1.0.0 稳定版发布的候选版本。此版本包含一个错误修复。
错误修复
- 修复了在使用 Fragment 和
singleTop
导航操作时出现的问题。 b/124294805
版本 1.0.0-beta02
2019 年 2 月 12 日
此版本包含一些次要改进和重要的错误修复。
新功能
- 现在可以使用
0
作为android:defaultValue
用于reference
参数。 b/124248602
行为变更
- 精确的深层链接匹配现在优先于具有
.*
或参数匹配的深层链接。 b/123969518
错误修复
popBackStack()
和navigateUp
现在在从回退堆栈中弹出最后一个目标时会正确地返回false
,修复了在1.0.0-beta01
中引入的回归问题。 b/123933201- Navigation 现在在恢复保存的实例状态期间会正确地设置
ClassLoader
,避免在Navigator
保存的状态或发送到NavDestination
的参数中使用自定义类时出现问题。 b/123893858 - Safe Args 生成的 NavArgs 类在从保存的实例状态恢复
Parcelable[]
参数时不再崩溃。 b/123963545 - Safe Args 现在会正确地清除不必要的生成的 Kotlin 类。 b/124120883
版本 1.0.0-beta01
2019 年 2 月 4 日
这是 Navigation 的第一个 beta 版本;展望未来,Navigation API 预计在下一个版本之前会保持稳定,除非出现严重问题。此版本包含一些错误修复和行为更改。
行为变更
- Navigation 现在确保在运行时和通过 Safe Args 对参数默认值进行相同处理。因此,只有具有
app:argType="reference"
的参数才能具有指向另一个资源的默认值(例如,@color/colorPrimary
)。尝试使用具有不同app:argType
的引用默认值将在解析导航 XML 时导致异常。 b/123551990 - Safe Args 现在依赖于 Android Gradle 插件 3.3.0 aosp/888413
- Safe Args 现在依赖于 Kotlin 1.3.20 aosp/888414
错误修复
- Safe Args 现在可以在所有版本的 Android Gradle 插件上用于库和功能模块。 b/121304903
- 修复了会导致单个
popBackStack()
操作弹出回退堆栈顶部所有目标副本而不是一次只弹出单个目标的回归问题。 b/123552990 - 修复了
FragmentNavigator
状态会与NavController
的状态不同步,从而在尝试恢复回退堆栈时导致IllegalStateException
的问题。 b/123803044 - 修复了在使用 ProGuard 进行混淆时,
NavigationUI
处理的返回箭头不会出现的问题。 b/123449431 - Safe Args 生成的代码现在会正确地处理使用指向以
.OuterClass$InnerClass
格式的静态内部类的app:argType
。 b/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()
属性委托在Activity
或Fragment
中延迟获取对 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()
方法已移至ActivityNavigator
。 b/122413117 - Safe Args 现在避免对没有参数的操作重复相同的类。在生成的 NavDirections 类中,无参数方法的返回类型现在为
NavDirections
。 b/123233147 - Safe Args 生成的 Directions 类不再具有公共构造函数 - 您应该只与生成的静态方法进行交互。 b/123031660
- Safe Args 生成的
NavDirections
类不再具有公共构造函数 - 它们应该只通过生成的 Directions 类中的静态方法生成。 b/122963206 - 从
NavDirections
的getArguments()
返回的Bundle
现在被标记为@NonNull
而不是@Nullable
。 b/123243957
错误修复
NavDeepLinkBuilder
现在会通过使用您传入的参数来确定唯一性,从而正确地处理同时针对同一目标的多个PendingIntent
。 b/120042732NavController
现在在使用嵌套的NavHostFragment
或具有回退堆栈的其他子 Fragment 时,会正确地处理popBackStack()
操作。 b/122770335NavigationUI
现在会正确地设置上箭头的内容描述。 b/120395362- Safe Args 生成的 Directions 类现在可以正确处理与目标上的操作具有相同 ID 的全局操作。 b/122962504
- Safe Args 生成的
NavDirections
类现在在equals()
返回 true 时具有相等的hashCode()
值。 b/123043662 FragmentNavigator
现在会在您尝试在NavHostFragment
的FragmentManager
上进行自定义FragmentTransactions
时抛出一个更好的错误消息。您应该始终使用getChildFragmentManager()
。 b/112927148
版本 1.0.0-alpha09
2018 年 12 月 18 日
此版本包含破坏性 API 更改;请参阅下面的“破坏性更改”部分。
我们选择不再继续开发 android.arch.navigation:navigation-testing
工件。虽然它已被证明有助于对 NavController
进行内部测试,但我们强烈建议使用其他测试策略,例如模拟 NavController
实例以验证是否正在进行正确的 navigate()
调用。这种方法在 AndroidDevSummit 2018 上的单一活动演讲 中进行了详细讨论,我们将努力提供更多关于使用 Navigation 进行测试的文档。
新功能
- 具有
menuCategory="secondary"
的MenuItem
在与NavigationUI
方法一起使用时将不再弹出后退栈。 b/120104424 AppBarConfiguration
现在允许您设置一个备用OnNavigateUpListener
实例,当navController.navigateUp()
返回false
时将调用该实例。 b/79993862 b/120690961
破坏性更改
- 当使用具有
argType="reference"
的<argument>
时,Navigation 将不再解析引用,而是提供原始资源 ID 本身。 b/111736515 onNavDestinationSelected()
现在默认会弹出回到导航图的起始目的地,使其与setup
方法一致。在您的MenuItem
中添加menuCategory="secondary"
以避免弹出后退栈。 aosp/852869- 生成的
Args
类的fromBundle()
方法现在接受一个非空Bundle
,而不是一个可空Bundle
aosp/845616
错误修复
- 参数现在从深层链接中正确解析为正确的
argType
,而不是始终作为字符串 b/110273284 - Navigation 现在可以正确导出其公共资源 b/121059552
- Safe Args 现在与 Android Gradle 插件 3.4 Canary 4 及更高版本兼容 b/119662045
版本 1.0.0-alpha08
2018 年 12 月 6 日
此版本包含破坏性 API 更改;请参阅下面的“破坏性更改”部分。
新功能
- 目的地标签在与
NavigationUI
方法一起使用时,现在将自动将您android:label
中的{argName}
实例替换为正确的参数 b/80267266 - Navigation 现在依赖于 Support Library 28.0.0 b/120293333
破坏性更改
OnNavigatedListener
已重命名为OnDestinationChangedListener
b/118670572OnDestinationChangedListener
现在还传递参数的Bundle
aosp/837142app:clearTask
和app:launchDocument
属性及其关联的方法已被删除。使用app:popUpTo
以及您的图的根节点以从后退栈中移除所有目的地。 b/119628354ActivityNavigator.Extras
现在使用Builder
模式,并添加了设置任何Intent.FLAG_ACTIVITY_
标志的能力 aosp/828140NavController.onHandleDeepLink
已重命名为handleDeepLink
aosp/836063- 许多不适合子类化的类和方法,例如
NavOptions
、NavInflater
、NavDeepLinkBuilder
和AppBarConfiguration
,已被设为final
aosp/835681 - 已删除过时的
NavHostFragment.setGraph()
方法 aosp/835684 - 已删除过时的
NavigationUI.navigateUp(DrawerLayout, NavController)
方法。 aosp/835684 - 片段创建已移至
FragmentNavigator
,使将片段创建委托给FragmentFactory
变得更加容易。 b/119054429 NavGraphNavigator
的构造函数不再接受Context
aosp/835340- NavigatorProvider 现在是一个类,而不是一个接口。由
getNavigatorProvider()
返回的NavigatorProvider
并没有改变其功能。 aosp/830660 NavDestination.navigate()
已被删除。请改为在Navigator
上调用navigate()
。 aosp/830663- 对
Navigator
进行了重大重构,消除了对OnNavigatorNavigatedListener
的需求,而是让navigate
返回导航到的NavDestination
。 Navigator
实例不再可以向NavController
发送弹出事件。考虑使用OnBackPressedCallback
来拦截后退按钮按下并调用navController.popBackStack()
。 aosp/833716
错误修复
popUpTo
现在在目的地是<navigation>
元素时能够一致地工作 b/116831650- 修复了使用嵌套图时导致
IllegalArgumentException
的多个错误 b/118713731 b/113611083 b/113346925 b/113305559 <activity>
目的地的dataPattern
属性现在将通过调用toString()
来填充来自非字符串参数的参数 b/120161365
安全参数
- Safe Args 支持可序列化对象,包括枚举值。枚举类型可以通过使用没有类名的枚举文字来设置默认值(例如
app:defaultValue="READ"
) b/111316353 - Safe Args 支持所有受支持类型数组 b/111487504
- Safe Args 现在忽略资源目录的子文件夹 b/117893516
- Safe Args 在适当的地方添加了
@Override
注释 b/117145301
版本 1.0.0-alpha07
2018 年 10 月 29 日
新功能
- 新的 AppBarConfiguration 类允许您自定义哪些目的地被认为是顶级目的地。有关详细信息,请参阅 更新的文档。 b/117333663
- 您现在可以向图的起始目的地传递参数 b/110300470
- 深层链接现在支持带有句点、连字符和加号的自定义方案。 b/112806402
破坏性更改
navigation-testing-ktx
模块已合并到navigation-testing
工件中,并且将不再发布。navigation-testing
工件现在依赖于 Kotlin 标准库。API 已更改为更符合 Kotlin 约定,但您仍然可以使用它进行用 Java 编写的测试。- 元数据清单注册的导航图不再受支持。 b/118355937
- 操作不再可以附加到 <activity> 目的地。 aosp/785539
错误修复
- 深层链接现在可以正确解析查询参数。 b/110057514
- 活动目的地现在可以正确应用所有进入和退出动画。 b/117145284
- 修复了使用自定义 Navigator 时在配置更改后发生的崩溃。 b/110763345
安全参数
- Safe Args 现在对 Android Gradle 插件 3.2.1 有一个固定依赖项。 b/113167627
- 现在可以为内部类生成 Directions。 b/117407555
- 修复了向 <include> 图生成 Directions 的问题。 b/116542123
版本 1.0.0-alpha06
2018 年 9 月 20 日
新功能
- 现在支持片段和活动目的地的共享元素过渡 b/79665225。有关更多信息,请参阅 使用导航架构组件实现导航
- 现在,选择
NavigationView
中的项目将关闭任何包含的底部工作表 b/112158843
API 更改
- 重大变更: Navigator
navigate()
方法现在接受一个Navigator.Extras
参数。 - NavController 的
getGraph()
方法现在是NonNull
b/112243286
错误修复
NavigationUI.setupWithNavController()
在与来自各个目的地的视图一起使用时不再泄漏视图 b/111961977- Navigator
onSaveState()
现在只调用一次 b/112627079
安全参数
- 导航目的地 Directions 类现在扩展其父 Directions 类(如果存在) b/79871405
- Directions 和 Args 类现在具有有用的
toString()
实现 b/111843389
版本 1.0.0-alpha05
2018 年 8 月 10 日
错误修复
- 修复了导致后退栈行为不正确的错误。 b/111907708
- 修复了生成的 Args 类的
equals()
中的错误。 b/111450897 - 修复了 Safe Args 中的构建失败。 b/109409713
- 修复了从资源标识符到 java 名称的转换 b/111602491
- 修复了 Safe Args 插件中有关可空性的错误消息。
- 添加了缺少的可空性注释。
版本 1.0.0-alpha04
2018 年 7 月 19 日
导航 1.0.0-alpha04
及其关联的 Safe Args gradle 插件包含一些 API 更改、行为更改和错误修复。
API/行为更改
- NavHostFragment 将始终将当前 Fragment 设置为主导航 Fragment,确保在弹出外部 NavController 之前弹出子 Fragment 管理器 b/111345778
安全参数
- 重大更改:
app:type
已更改为app:argType
,以避免与 ConstraintLayout 2.0.0-alpha1 等其他库发生冲突 b/111110548 - Safe Args 的错误消息现在可点击 b/111534438
- Args 类现在确认
NonNull
属性实际上不为 null b/111451769 - 已将额外的
NonNull
注释添加到 NavDirections 和生成的 Args 类 b/111455455 b/111455456
错误修复
- 修复了深层链接到 Fragment 目标后系统后退按钮出现的问题 b/111515685
版本 1.0.0-alpha03
2018 年 7 月 12 日
导航 1.0.0-alpha03
及其关联的 Safe Args gradle 插件包含一些 API 更改、行为更改和错误修复。
API/行为更改
- 已添加用于 Toolbar 的 NavigationUI.setupWithNavController 方法 b/109868820
- 已添加用于 CollapsingToolbarLayout 的 NavigationUI.setupWithNavController 方法 b/110887183
- popBackStack() 现在在回退堆栈为空或给定的目标 ID 不在回退堆栈中时返回 false b/110893637
- FragmentNavigator 现在在 FragmentManager 保存状态后忽略导航操作,避免出现“在 onSaveInstanceState 后无法执行此操作”异常 b/110987825
安全参数
- 重大更改:操作和参数名称中的非字母数字字符将在相应的 NavDirections 方法名称中被替换为驼峰式大小写。
- 例如,
DemoController.index
将变为setDemoControllerIndex
b/79995048 - 例如,
action_show_settings
将变为actionShowSettings
b/79642240
- 例如,
- 重大更改:参数现在默认情况下被视为非空。要允许字符串和可打包参数为空值,请添加
app:nullable="true"
b/79642307 - 您现在可以使用
app:type="long"
,其默认值形式为“123L” b/79563966 - 现在支持可打包参数,使用完全限定的类名作为
app:type
。唯一支持的默认值为"@null"
b/79563966 - Args 类现在实现
equals()
和hashCode()
b/79642246 - Safe Args 插件现在可以应用于库项目 b/80036553
- Safe Args 插件现在可以应用于功能项目 b/110011752
错误修复
- 修复了在 Fragment 生命周期方法中导航时出现的问题 b/109916080
- 修复了多次通过嵌套图导航时出现的问题 b/110178671
- 修复了在使用
setPopUpTo
时,图中的第一个目标出现问题 b/109909461 - 修复了所有
app:defaultValue
值都被作为字符串传递的问题 b/110710788 - 与 Android Gradle 插件 3.2 Beta 01 捆绑在一起的 aapt2 现在为导航 XML 文件中的每个
android:name
属性添加保留规则 b/79874119 - 修复了替换默认 FragmentNavigator 时的内存泄漏问题 b/110900142
版本 1.0.0-alpha02
2018 年 6 月 7 日
行为更改
FragmentNavigator
现在使用setReorderingAllowed(true)
。 b/109826220导航现在对从深层链接 URL 解析的参数进行 URL 解码。 b/79982454
错误修复
修复了在从 Fragment 生命周期方法中调用导航时出现的
IllegalStateException
。 b/79632233导航现在依赖于 Support Library 27.1.1,以修复在使用动画时出现的闪烁问题。 b/80160903
修复了在使用 defaultNavHost="true" 作为子 Fragment 时出现的
IllegalArgumentException
。 b/79656847修复了在使用 NavDeepLinkBuilder 时出现的
StackOverflowError
。 b/109653065修复了在导航回嵌套图时出现的
IllegalArgumentException
。 b/80453447修复了在使用
launchSingleTop
时出现的 Fragment 重叠问题。 b/79407969导航现在为嵌套图构建正确的合成回退堆栈。 b/79734195
NavigationUI 现在将在使用嵌套图作为
MenuItem
时突出显示正确的项目。 b/109675998
API 更改
操作的
clearTask
属性和NavOptions
中的关联 API 已弃用。 b/80338878操作的
launchDocument
属性和NavOptions
中的关联 API 已弃用。 b/109806636
版本 1.0.0-alpha01
2018 年 5 月 8 日
导航 提供了一个用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01
。