导航
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 12 月 11 日 | 2.8.5 | - | - | 2.9.0-alpha04 |
声明依赖项
如需添加 Navigation 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle
文件中添加所需制品的依赖项:
Groovy
plugins { // Kotlin serialization plugin for type safe routes and navigation arguments id 'org.jetbrains.kotlin.plugin.serialization' version '2.0.21' } dependencies { def nav_version = "2.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" // JSON serialization library, works with the Kotlin serialization plugin. implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3" }
Kotlin
plugins { // Kotlin serialization plugin for type safe routes and navigation arguments kotlin("plugin.serialization") version "2.0.21" } dependencies { val nav_version = "2.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") // JSON serialization library, works with the Kotlin serialization plugin implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") }
Safe Args
To add Safe Args
to your project, include the following classpath
in your top level build.gradle
file:
Groovy
buildscript { repositories { google() } dependencies { def nav_version = "2.8.5" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }
Kotlin
buildscript { repositories { google() } dependencies { val nav_version = "2.8.5" classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version") } }
You must also apply one of two available plugins.
To generate Java language code suitable for Java or mixed Java and Kotlin modules, add
this line to your app or module's build.gradle
file:
Groovy
plugins { id 'androidx.navigation.safeargs' }
Kotlin
plugins { id("androidx.navigation.safeargs") }
Alternatively, to generate Kotlin code suitable for Kotlin-only modules add:
Groovy
plugins { id 'androidx.navigation.safeargs.kotlin' }
Kotlin
plugins { id("androidx.navigation.safeargs.kotlin") }
You must have android.useAndroidX=true
in your
gradle.properties
file as per
Migrating to AndroidX.
如需了解如何使用 Kotlin 扩展,请参阅 ktx 文档。
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 2.9
版本 2.9.0-alpha04
2024 年 12 月 11 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha04
。版本 2.9.0-alpha04 包含这些提交内容。
新功能
- 以前只能通过
reified
方法(即composable<YourScreen>
现在具有直接采用KClass
实例的非封装版本。Ia7eed、Id2879、Ibf244、I17d79、Id09d2、I54696、Ia47be、I93281、Ic1bf0、Iba4ee、If56a5、Icf969、I67644、I6f788、b/382094941、b/366291612、b/381938808
下表提供了 reified 和 KClass API。
具体化 | KClass |
---|---|
composable<TestClass> { } |
composable(TestClass::class) { } |
navigation<NestedGraph>(startDestination = TestClass::class) |
navigation(route = NestedGraph::class, startDestination = TestClass::class) |
dialog<TestClass> {} |
dialog(TestClass::class) {} |
navDeepLink<TestClass>(baseUri) |
navDeepLink(TestClass::class, baseUri) |
NavDeepLink.Builder.setUriPattern<TestClass>(baseUri) |
NavDeepLink.Builder.setUriPattern(TestClass::class, baseUri) |
NavDestinationBuilder.deepLink<TestDeepLink>(baseUri) { } |
NavDestinationBuilder.deepLink(TestDeepLink::class, baseUri) { } |
navController.getBackStackEntry<TestClass>() |
navController.getBackStackEntry(TestClass::class) |
navController.popBackStack<TestClass>(true) |
navController.popBackStack(TestClass::class, true) |
navController.clearBackStack<TestClass>() |
navController.clearBackStack(TestClass::class) |
NavOptions.setPopUpTo<TestClass>() |
NavOptions.setPopUpTo(TestClass::class) |
navOptions { popUpTo<TestClass> {...} } |
navOptions { popUpTo(TestClass::class) {...} } |
NavGraph.setStartDestination<TestClass>() |
NavGraph.setStartDestination(TestClass::class) |
NavGraph.findNode<TestClass>() |
NavGraph.findNode(TestClass::class) |
backStackEntry.toRoute<TestClass>() |
backStackEntry.toRoute(TestClass::class) |
savedStateHandle.toRoute<TestClass>() |
savedStateHandle.toRoute(TestClass::class) |
API 变更
- 用于类型安全的 Kotlin 专用
NavGraph.setStartDestination
重载会从 Java 源代码中隐藏。(Ic640c、b/364634035)
bug 修复
- 从 Navigation
2.8.5
开始:修复了以下问题:如果返回堆栈被弹出到 1 个条目,并且在同一帧中触发系统返回,NavHost
可能会在PredictiveBackHandler
内抛出异常。(I1a429、b/375343407) - 从 Navigation
2.8.5
开始:修复了更新图的startDestination
时出现的NavDestination
NullPointerException
。(I99421、b/361560785)
版本 2.9.0-alpha03
2024 年 11 月 13 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha03
。版本 2.9.0-alpha03 包含这些提交内容。
新功能
- Navigation 类型安全性现在支持将值类用作路线或路线的参数类型。(I9344a、b/374347483)
bug 修复
- 修复了以下问题:当附加到
NavBackStackEntry
的LifecycleObserver
在宿主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
接口,这会向NavController
指示这些目的地将与其他目的地一起显示。例如,通过使用此接口,可以同时RESUMED
多个目的地。(Id5559) - 从 Navigation
2.8.3
开始:为navigation-common
、navigation-runtime
和navigation-compose
模块添加了新的 lint 检查,以帮助识别未正确使用@Serializable
注解的任何类型安全路线。此检查会应用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I28bda、b/362725816) - 从 Navigation
2.8.3
开始:为navigation-common
、navigation-runtime
和navigation-compose
模块添加了新的 lint 检查,以帮助识别使用未正确使用@Keep
注解的枚举参数的任何类型安全路线。此检查会应用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I2b46f、b/358687142)
行为变更
- 现在,如果尝试使用之前已
DESTROYED
的NavController
,则会导致IllegalStateException
。(I520da、b/369616172)
bug 修复
- 更新了“找不到枚举类”异常,建议使用
@Keep
注解,以防枚举类在缩减后的 build 中被清除。(I90e79、b/358137294)
已知问题
Navigation 2.8.*
中添加的新 lint 规则存在问题,会导致在尝试使用 Android Gradle 插件 8.4 及更高版本运行 lint 时出现Obsolete custom lint check
错误。b/368070326、b/371463741
版本 2.8
版本 2.8.5
2024 年 12 月 11 日
发布了 androidx.navigation:navigation-*:2.8.5
。版本 2.8.5 包含这些提交内容。
bug 修复
- 修复了以下问题:如果返回堆栈被弹出到 1 个条目,并且在同一帧中触发系统返回,
NavHost
可能会在PredictiveBackHandler
内抛出异常。(I1a429、b/375343407) - 修复了更新图表的
startDestination
时出现的NavDestination
NullPointerException
。(I99421、b/361560785) - 修复了以下问题:使用 Navigation Compose 并在当前动画结束的同一帧中调用 navigate 时,会导致意外的缩放动画。(I26cb1、b/353294030)
- 修复了以下问题:当附加到
NavBackStackEntry
的LifecycleObserver
在宿主LifecycleOwner
(例如包含的 activity 或 fragment)更改其生命周期状态时触发返回堆栈更改时,可能会发生ConcurrentModificationException
。(Ia9494)
版本 2.8.4
2024 年 11 月 13 日
发布了 androidx.navigation:navigation-*:2.8.4
。版本 2.8.4 包含这些提交内容。
新功能
- Navigation
2.9.0-alpha03
:导航类型安全性现在支持将值类用作路线或路线的参数类型 (I9344a、b/374347483)
bug 修复
- 从 Navigation
2.9.0-alpha01
起:尝试使用之前已DESTROYED
的NavController
现在会导致IllegalStateException
。(I520da、b/369616172)
版本 2.8.3
2024 年 10 月 16 日
发布了 androidx.navigation:navigation-*:2.8.3
。版本 2.8.3 包含这些提交内容。
新功能
- 为
navigation-common
、navigation-runtime
和navigation-compose
模块添加了新的 lint 检查,以帮助识别未正确使用@Serializable
注解的任何类型安全路线。此检查会应用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I28bda、b/362725816) - 为
navigation-common
、navigation-runtime
和navigation-compose
模块添加了新的 lint 检查,以帮助识别使用未正确带有@Keep
注解的枚举参数的任何类型安全路线。此检查会应用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I2b46f、b/358687142)
bug 修复
- 修复了以下问题:当尝试使用 Android Gradle 插件 8.4 及更高版本运行 lint 时,在
Navigation 2.8.*
中添加的新 lint 规则会导致Obsolete custom lint check
错误。I1be3d、b/368070326、b/371463741
已知问题
- 尝试使用 Lint 16 (AGP 8.7) 或更高版本运行 lint 时,Navigation lint 会抛出“已废弃的自定义 lint 检查”错误。(b/371926651)
版本 2.8.2
2024 年 10 月 2 日
发布了 androidx.navigation:navigation-*:2.8.2
。版本 2.8.2 包含这些提交内容。
新功能
- Navigation Type Safety 现在支持包含
Double
、Double?
、DoubleArray
、DoubleArray?
、List<Double>
和List<Double>?
的可序列化类,而无需任何自定义NavType
。(I570eb、Ibc4c0、I37461、I5bed4、b/359245753)
bug 修复
- 改进了导航失败将路线实参映射到
NavType
时的错误消息,新错误消息将包含实参名称、实参完全限定名称和路线的完全限定名称。(Id8416、b/346264232)
版本 2.8.1
2024 年 9 月 18 日
发布了 androidx.navigation:navigation-*:2.8.1
。版本 2.8.1 包含这些提交内容。
新功能
- 添加了新的 lint 规则,以确保在尝试使用类型安全 API
popBackStack
时,使用接受重新封装类类型的popBackStack
函数。(Ief161、b/358095343)
bug 修复
- 导航现在要求传递给
NavGraph
的startDestination
的路线包含所有必需参数的值,包括非 null 且没有默认值的参数。(I18e74、b/362594265) - Navigation Safe Args 添加了对非 null 字符串的支持,以便“null”值会按原样解析并存储到 bundle 中。这与将“null”值解析为 null 对象的现有行为不同。此更改仅适用于非 null 的 String 类型。可为 null 的字符串保持不变。(I08b4a、b/348936238)
- 除非通过明确添加到目的地的深层链接,否则无法再深层链接到
NavDestination
。这也意味着,您只能使用接受字符串路线的 navigate 函数重载来导航到目的地的路线。修复了一个漏洞,该漏洞会导致深层链接到可能受保护的目的地。(Ie30e6)
依赖项更新
- Navigation Safe Args 现在依赖于 Kotlin 1.9.24,而不是 Kotlin 2.X,确保开发者不会被强制更新。(a4129a)
- Navigation Compose 现在依赖于 Compose
1.7.2
。
版本 2.8.0
2024 年 9 月 4 日
发布了 androidx.navigation:navigation-*:2.8.0
。版本 2.8.0 包含这些提交内容。
自 2.7.0 以来的重要变更
Navigation Kotlin DSL 类型安全
- Navigation 现在使用 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 满足类型安全博文。
Navigation Compose 预测性返回
- Navigation Compose 现在通过 compose-animation 中的新
SeekableTransitionState
API 支持预测性应用内返回。这样,您就可以使用返回手势查看带有自定义转场效果的上一个目的地,然后再决定是通过完成的手势提交事务,还是取消。
Navigation Fragment 可组合项
- 添加了一个新的
navigation-fragment-compose
工件,其中包含NavHostFragment
的ComposableNavHostFragment
替代项,可让您向 Navigation XML 文件添加可组合目的地。每个composable
目的地都必须表示为顶级无参数@Composable
方法,其完全限定名称用作每个目的地的android:name
属性。导航到其中一个目的地时,系统会创建一个包含 fragment 来显示可组合项内容。
// In HomeScreen.kt
@Composable
fun HomeScreen() {
// Your Composable content here
}
// In your navigation.xml
<composable
android:id="@+id/home_screen"
android:name="com.example.HomeScreenKt\$HomeScreen" />
其他更改
- Navigation Compose 现在依赖于 Compose 1.7.0。
- Navigation 现在提供了一个新的
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 包含这些提交内容。
bug 修复
- 修复了将顶级枚举类作为类型安全参数传入时导航崩溃的问题。(I0ba76、b/358137294)
- Navigation 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,系统仅支持嵌套在其他类中的枚举。下一个版本将支持顶级枚举。
bug 修复
- 导航到重复或共享目的地时,导航系统会优先前往图中与当前位置最接近的匹配目的地。(Ic89a4、b/352006850)
- safe args 中的导航功能现在添加了新的
NavType.EnumType
。这意味着Enum
类型不再需要自定义NavType
。请注意,Enum
的SerialName
必须是默认的完全限定名称。(I66d22、b/346475493) - Safe Args 中的 Navigation 添加了对可为 null 的参数类型(包括
Int?
、Long?
、Float?
、Boolean?
和Enum<*>?
)的内置支持。(I32d13、I1c580、Ifba66、I978b0、Ide076 、b/351994237) - 现在,如果传递给
NavGraph
的startDestination
路线与startDestination.route
完全相同,则NavGraph
的startDestination
将使用默认实参值。(I13762、b/354046047)
版本 2.8.0-beta06
2024 年 7 月 24 日
发布了 androidx.navigation:navigation-*:2.8.0-beta06
。版本 2.8.0-beta06 包含这些提交内容。
bug 修复
- 修复了
WrongStartDestinationType
lint 检查未检查传入类类型中的伴生对象,导致 lint 无法检测错误的问题。(I92b09)
版本 2.8.0-beta05
2024 年 7 月 10 日
发布了 androidx.navigation:navigation-*:2.8.0-beta05
。版本 2.8.0-beta05 包含这些提交内容。
bug 修复
- 修复了嵌套
NavGraphs
共享相同startDestination
路线时singleTop
导航崩溃的问题。(I17b94、b/294408596)
版本 2.8.0-beta04
2024 年 6 月 26 日
发布了 androidx.navigation:navigation-*:2.8.0-beta04
。版本 2.8.0-beta04 包含这些提交内容。
bug 修复
- Navigation 现在支持在路径参数中使用空字符串进行导航。(Ic5dbd、b/339481310)
- 改进了通过
@Serializable(with =...)
直接在类字段上声明的自定义序列化程序的错误消息,以明确说明这目前是一项不受支持的功能。(I052b0、b/341319151) SavedStateHandleFactory
测试 API 现在可以在非 Android 测试中使用,但需要 Robolectric 支持使用 Bundle 解析参数。(I76cdc、b/340966212)- 修复了在 Compose 中使用类型安全导航时,在进程终止后恢复应用时因恢复状态而崩溃的问题。(Ia8f38、b/341801005)
- 修复了 Navigation Compose 中的一个问题:取消预测性返回手势后,用户返回的
NavBackStackEntry
永远不会返回到RESUMED
生命周期状态。这还可确保返回的目标页面以正确的动画效果返回,而不是在快速滑动后立即弹回原位。(I97a0c、b/346608857) - 将预测性返回与 Navigation Compose 搭配使用时,要弹出的目的地现在将具有适当的 z 顺序,并在传入目的地之上正确进行动画处理。(I2077b、b/345993681)
版本 2.8.0-beta03
2024 年 6 月 12 日
发布了 androidx.navigation:navigation-*:2.8.0-beta03
。版本 2.8.0-beta03 包含这些提交内容。
API 变更
CollectionNavType
有一个新的抽象emptyCollection()
方法。替换此方法以处理作为参数传入的空集合。(Ie4d84、b/341723133)
bug 修复
- 添加了有关
NavType.serializeAsValue
和serializeAsValues
的文档,以强调最终输出应采用 URI 编码。(Ida6bd、b/344943214) - 修复了使用 null
CollectionNavType
参数调用toRoute<T>
时发生崩溃的问题。使用 nullCollectionNavType
进行导航时,输出参数将是 Serializable 类上声明的默认值,如果没有默认值,则为emptyCollection()
的返回值。(I84158、Id630f、b/342672856)
版本 2.8.0-beta02
2024 年 5 月 29 日
发布了 androidx.navigation:navigation-*:2.8.0-beta02
。版本 2.8.0-beta02 包含这些提交内容。
bug 修复
- 修复了将
NavBackStackEntry.toRoute
与可为 null 的自定义NavType
搭配使用时发生的ClassCastException
崩溃问题。(I1c29b、b/342239473) - 修复了尝试恢复无法通过当前目的地的 ID 访问的返回堆栈条目时导致的 Navigation 返回堆栈状态恢复问题。由于路由由 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)
bug 修复
- 添加了 Navigation Kotlin DSL 函数缺少的参数文档。(I26a36)
版本 2.8.0-alpha08
2024 年 5 月 1 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha08
。版本 2.8.0-alpha08 包含这些提交内容。
Navigation Compose 中的 Safe Args
- 我们已完成为 Navigation Compose 和基于 Kotlin 序列化的 Navigation Kotlin DSL 用户提供编译时类型安全的相关工作,之前的实验性 API 现已稳定。(Iea94d、I0eb0d、I873b7、I3a64b、I6c3a2、I11f0b、Ic3032、I8d394、I95710、Ice060、Id0e55、I45f8b、Idcdaf、If5380、I08b23、Ia5c59、b/188693139)
此功能使用 Kotlin 序列化,让您可以通过类型安全的对象和数据类在导航图中定义目的地:
// Define a home destination that doesn't take any arguments
@Serializable
object Home
// Define a profile destination that takes an ID
@Serializable
data class Profile(val id: String)
// Now define your NavHost using type safe objects
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile)
}
}
如需了解详情,请参阅 Navigation Compose 满足类型安全博文。
新功能
navigation-fragment-compose
工件现在会向ComposableFragment
内的可组合项方法提供LocalFragment
CompositionLocal。(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
工件,其中包含NavHostFragment
的ComposableNavHostFragment
替代项,可让您向导航 XML 文件添加composable
目的地。每个composable
目的地都必须表示为顶级无参数@Composable
方法,其完全限定名称用作每个目的地的android:name
属性。导航到其中一个目的地时,系统会创建一个包含 fragment 来显示可组合项内容。(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 变更
- 继续支持在 Navigation Compose 中使用基于 Kotlin 序列化的方法使用 Safe Args。这些 API 尚未完成,并带有
ExperimentalSafeArgsApi
注解。在未来的版本中,当整个 API Surface 完成后,此注释将被移除。(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 变更
- 我们已开始支持在 Navigation Compose 中使用基于 Kotlin 序列化的方法使用 Safe Args。这些 API 尚未完成,并带有
ExperimentalSafeArgsApi
注解。在未来的版本中,当整个 API Surface 完成后,此注释将被移除。(I644e7、I98896、I2a1c5、I43a51、I836a1、Ic5eec、I39407、I24e41、If9e14、Ibb13e、If44d3、Icb70f、I8972f、I1d432、Icf32b、I20a14、I262aa、I7de99、I35990、I1033d、b/188693139)
bug 修复
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)
bug 修复
- 深层链接中的查询参数现在允许将参数名称(即
{argName}
)用大括号括起来的值作为基于字符串的NavTypes
的有效值。这修复了以下问题:对于所有类型,此类值都会被视为无效(或没有值)。(I18302、b/327274038) - 支持
navigate
或popBackStack
等路由的NavController
函数现在可以正确匹配使用数组NavTypes
的参数填充的路由。(Iea805、b/327229511)
版本 2.8.0-alpha04
2024 年 3 月 6 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha04
。版本 2.8.0-alpha04 包含这些提交内容。
新功能
- 现在,您可以在 Navigation Compose 中为转场效果指定
SizeTranform
,方法是在composable
和/或navigation
函数的初始化过程中定义转场效果。(I91062、b/296912651)
bug 修复
- 修复了以下问题:在没有使用手势的情况下使用系统返回时,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)
bug 修复
- 修复了 Navigation 中的一个问题,该问题会导致
NavGraph
ViewModel 过早进入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 中包含这些提交内容。
bug 修复
- 修复了
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 中包含这些提交内容。
bug 修复
- 从导航
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 中包含这些提交内容。
bug 修复
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)
bug 修复
- 修复了以下问题:如果您使用完全相同的图表多次调用
setGraph
,只有当图表中包含将两个目的地关联起来的操作时,返回堆栈才会弹出。(Ieaed7) - 快速依次导航到和关闭的对话框将不再泄露到
NavController.visibleEntries
列表中。(I67586、b/287969970) - 现在,如果
saveState
为 false,则在弹出条目后发生配置更改时,系统会正确清除该条目的ViewModel
。(Idf242、b/298164648) - 修复了以下问题:如果返回堆栈在配置更改之前完全为空,或者仅当传入 intent 设置了
FLAG_ACTIVITY_NEW_TASK
标志时调用setGraph
,NavController
可能会多次处理同一深层链接。(I73c7f)
依赖项更新
- 现在,“使用 Fragment 的 Navigation”依赖于 Fragment 1.6.2,修复了调用
clearBackStack
时嵌套 fragment 的ViewModel
实例不会被清除的问题。
版本 2.7.4
版本 2.7.4
2023 年 10 月 4 日
发布了 androidx.navigation:navigation-*:2.7.4
。版本 2.7.4 中包含这些提交内容。
新功能
- 添加了对
popUpTo
使用带参数的路线的支持,以允许弹回到使用这些确切参数的特定条目,与popBackStack
中提供的支持一致。(I731f4、b/299255572)
bug 修复
- 修复了使用
popUpTo
通过另一个导航操作中断导航操作会导致FragmentNavigator
崩溃的问题。(I3c848、b/301887045) - 修复了系统返回按钮导致
currentDestination
无法正确更新以匹配显示的 Fragment 的问题。(Id0d6c、b/289877514) - 现在,当其上方的对话框关闭时,
DialogFragment
生命周期会正确移至RESUMED
状态。(I88f0d、b/301811387)
版本 2.7.3
版本 2.7.3
2023 年 9 月 20 日
发布了 androidx.navigation:navigation-*:2.7.3
。版本 2.7.3 中包含以下提交内容。
bug 修复
- 修复了 Navigation with Fragments 中导致
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 中包含这些提交内容。
bug 修复
- Navigation 现在依赖于 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) - 如果导航 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 中包含这些提交内容。
bug 修复
- 修复了 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 本身。
这意味着,NavHost
直接支持 AnimatedNavHost
中对设置自定义转场效果的所有支持。
我们不会对 Accompanist Navigation Animation 进行任何其他更改,并且很快就会正式弃用它,同时提供有关如何迁回 Navigation Compose 本身的指导,但它将与迁移指南相反,如果您已经在使用最新的 Accompanist alpha 版 (0.31.2-alpha
),则无需进行任何其他 API 更改。b/197140101
bug 修复
- Navigation Compose 中的 NavHost 现在会正确拦截系统返回调用,即使 activity 已停止和恢复也是如此。(Icb6de、b/279118447)
依赖项更新
- Navigation 现在依赖于
1.1.0
及更高版本的 Compose1.5.0
。
版本 2.7.0-rc01
2023 年 7 月 26 日
发布了 androidx.navigation:navigation-*:2.7.0-rc01
。版本 2.7.0-rc01 中包含这些提交内容。
bug 修复
- 修复了以下问题:在
NavHost
从组合中移除后,作为NavHost
的一部分创建的EnterTransition
和ExitTransition
lambda 可能会保留在内存中。(I893d0)
已知问题
- Navigation 2.6.x 存在一个问题,即使用 popUpTo 导航时可能会导致
IllegalArgumentException
。您或许可以通过重构图表来避免此异常,方法与此处建议的方法类似。(b/287133013)
版本 2.7.0-beta02
2023 年 6 月 28 日
发布了 androidx.navigation:navigation-*:2.7.0-beta02
。版本 2.7.0-beta02 中包含这些提交内容。
bug 修复
- Navigation Compose 现在为使用
popUpTo
选项进行导航的自定义转场提供了正确的 z 顺序。/Ib1c3a、b/285153947
版本 2.7.0-beta01
2023 年 6 月 7 日
发布了 androidx.navigation:navigation-*:2.7.0-beta01
。版本 2.7.0-beta01 中包含这些提交内容。
bug 修复
- Navigation 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 本身。
这意味着,NavHost
直接支持 AnimatedNavHost
中对设置自定义转换的所有支持。
我们不会对 Accompanist Navigation Animation 进行任何其他更改,并且很快就会正式弃用它,同时提供有关如何迁回 Navigation Compose 本身的指导,但它将与迁移指南相反,如果您已经在使用最新的 Accompanist alpha 版 (0.31.2-alpha
),则无需进行任何其他 API 更改。b/197140101
bug 修复
- 从 Navigation
2.6.0-rc02
开始:修复了 fragment 中的导航问题,即使用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 以来导航栏的重要变更
- 现在,
NavBackStackEntry
的arguments
和传递给OnDestinationChangedListener
的arguments
只是您在导航到目的地时创建的不可变参数的副本。这意味着,对这些 Bundle 所做的任何更改都不会反映在对arguments
或其他OnDestinationChangedListener
实例的后续访问中。 - 现在,
NavDeepLink
支持数组默认值,从而支持有重复的查询参数映射到参数数组类型。现在,NavType
还包含一个默认方法,您可以替换该方法以合并两个解析值。 NavType
的自定义子类现在可以替换serializeAsValue
,以将值序列化为字符串,从而允许(通过parseValue
)将序列化和反序列化对象完全封装在NavType
类中。StringType
现在替换了此方法,对给定的String
调用Uri.encode
。
自 2.5.0 以来 Navigation Compose 的重要变更
- 现在,使用
NavHost
预览可组合项时,系统会默认显示 NavGraph 的startDestination
。 NavController.popBackStack(route)
、NavController.getBackStackEntry(route)
、NavController.clearBackStack(route)
现在都支持包含部分或全部填充的参数的路线。请注意,参数必须与条目的参数完全匹配。- 现在,尝试使用
navDeepLink
Kotlin DSL 创建空NavDeepLink
会导致 lint 警告,指出深层链接需要 uri、action 和/或 mimetype 才能有效。
自 2.5.0 起 Navigation with Fragments 的重要变更
NavHostFragment
不再拦截系统返回按钮本身。这样,底层FragmentManager
便可处理系统返回。这样,Fragment1.7.0-alpha01
及更高版本便可在 Android U 设备上提供应用内预测性返回动画。- 将 Navigation 与 fragment 搭配使用时,如果尝试手动执行
FragmentTransaction
以将 fragment 添加到FragmentManager
的返回堆栈,现在会抛出IllegalArgumentException
。您应始终通过navigate()
API 添加 fragment。 - 在导航 XML 文件的 activity 元素中使用确切字符串
${applicationId}
作为app:data
和app:dataPattern
属性中的占位符时,系统会在膨胀时自动使用上下文的packageName
填充占位符。 - 在导航和弹出
NavBackStackEntries
时,FragmentNavigator
现在使用转换 API。这意味着,NavBackStackEntry
Lifecycle
现在会等待进入和退出 fragment 特效完成,然后再移动其最终的Lifecycle.State
。 - 在导航和弹出
NavBackStackEntries
时,DialogFragmentNavigator
现在使用转换 API。这意味着,NavBackStackEntry
Lifecycle
现在会等待DialogFragment
Lifecycle
移至DESTROYED
,然后再移至DESTROYED
本身。 NavHostFragment
现在允许您在NavHostFragment
附加到FragmentManager
后立即检索NavController
,而不是仅在onCreate()
之后。- Navigation 对动态功能模块的支持现在依赖于精细的 Play Feature Delivery 库。
- Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与版本 7.3.0 及更高版本兼容。
NavigationUI 在 2.5.0 之后发生的重要变化
- 将导航图的 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 中包含这些提交内容。
bug 修复
- 修复了 fragment 中的导航问题:使用
popUpTo
导航并从返回堆栈中弹出 fragment 而不重新创建其视图会导致系统返回停止工作。(Ieb8d4、b/281726455)
版本 2.6.0-rc01
2023 年 5 月 10 日
发布了 androidx.navigation:navigation-*:2.6.0-rc01
。版本 2.6.0-rc01 中包含这些提交内容。
bug 修复
- 修复了 Navigation 中与 fragment 相关的问题,其中在
onResume()
生命周期回调中通过 navigate 和popUpTo
移除 fragment 会导致IllegalStateException
。(I21884、b/279644470)
版本 2.6.0-beta01
2023 年 4 月 19 日
发布了 androidx.navigation:navigation-*:2.6.0-beta01
。版本 2.6.0-beta01 中包含这些提交内容。
新功能
NavBackStackEntry
现在提供自定义toString
实现。(Iff00b)
bug 修复
- 将 Navigation 与 fragment 搭配使用时,如果尝试手动执行
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 中包含这些提交内容。
bug 修复
- 修复了对无效路线的检查,如果
NavDestination
包含非 null 的NavArgument
,则此目的地的路线必须包含与非 null 的NavArgument
同名的参数占位符。(Ic62bf、b/274697949) - 现在,如果导航操作缺少
Action/MimeType
匹配的NavDestination
所需的非 nullNavArgument
,则基于Action/MimeType
的深层链接导航将会失败。(Ibfa17、b/271777424) - 现在,当
NavController
设置与上一个图相同的路线和目的地时,它会正确地将其当前图节点和返回堆栈目的地替换为新实例。这修复了在 Navigation Compose 中使用onLaunchSingleTop
而不保存状态时发生的崩溃问题。这还修复了导航到与根图表 build 关联的目的地和错误的返回堆栈时出现的错误。(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)
bug 修复
- 修复了在弹出包含非 null 参数的嵌套图表时发生的
NullPointerException
。(6b3581、b/249988437) - 使用
popUpTo
进行导航后使用系统返回时,NavController
的状态将弹出正确的条目。(I3a8ec、b/270447657) - 现在,无论是通过系统返回或
popBackStack()
弹出返回堆栈,以及事务是否针对 fragment 使用了效果,FragmentNavigator
都会正确弹出条目。(I81bdf) - 在不使用导航的情况下将 fragment 添加到
FragmentNavigator
的FragmentManager
中将不再导致崩溃。(b17204、b/274167493)
依赖项更新
- Navigation 现在依赖于 Lifecycle
2.6.1
。(586fe7) - Navigation 现在依赖于 SavedState
1.2.1
。(078e4e) - Navigation 现在依赖于 ProfileInstaller
1.3.0
。(512f0c)
版本 2.6.0-alpha07
2023 年 3 月 8 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha07
。版本 2.6.0-alpha07 中包含这些提交内容。
bug 修复
- 接受路线的
getBackStackEntry
、popBackStack
、clearBackStack
API 变体现在接受包含可为 null 的参数和可为 null 的查询参数的路线模式(I22294、b/269302500) - 修复了以下问题:从
NavController
调用clearBackStack()
不会清除与已清除的返回堆栈关联的 fragment 管理器中的已保存状态。(Ic1cce、b/271190202) - 修复了 2.6.0-alpha06 中的回归问题,该问题会导致在标签页之间使用系统返回时,
BottomNavigationView
中突出显示错误的MenuItem
。(I634f6、b/270447657) - 修复了 2.6.0-alpha06 中的回归问题,该问题会导致使用
Animation
时NavBackStackEntry
无法移至 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)
bug 修复
- 修复了在使用动态 fragment 导航时尝试导航时发生的崩溃问题。(I3ee29、b/268360479)
- 修复了通过系统返回按钮导航到其他 fragment 时底部栏不会更新为正确的所选项的 bug (If559f、b/269044426)
已知问题
- 将 Navigation 与 fragment 搭配使用时,使用
Animation
API 时NavBackStackEntry
的生命周期无法达到RESUMED
。(b/269646882) - 将 Navigation 与 Fragment 搭配使用并使用
BottomNavigation
进行导航时,如果您尝试恢复包含多个条目的返回堆栈,BottomMenuItem
将无法正确更新。(b/270447657) - 使用 Navigation with Fragments 时,恢复状态后,当 fragment 为
DESTROYED
时,NavBackStackEntry
Lifecycle
不会获取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)- 在导航和弹出
NavBackStackEntries
时,FragmentNavigator
现在使用转换 API。这意味着,NavBackStackEntry
Lifecycle
现在会等待进入和退出 fragment 特效完成,然后再移动其最终的Lifecycle.State
。(I3cb19、b/238686802) - 在导航和弹出
NavBackStackEntries
时,DialogFragmentNavigator
现在使用转换 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)
bug 修复
- 现在,在使用
push/popWithTransition
API 并且条目已在处理时,导航器状态将为空操作。(Iadbfa、b/261213893) - 将
launchSingleTop
与嵌套的NavGraph
搭配使用时,从原始目的地到其startDestination
的所有目的地都将仅正确添加到返回堆栈的顶部。(Id4bea、b/253256629) - 现在,导航到同一目的地并将
launchSingleTop
标志设置为 true 时,Navigation 会正确替换DialogFragment
实例。(I45b5a、b/149572817) - 使用长度正好为 19 个字符的参数时,Navigation SafeArgs 不会再导致编译错误。(Id60bc、b/257110095)
版本 2.6.0-alpha04
2022 年 11 月 9 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha04
。版本 2.6.0-alpha04 中包含这些提交内容。
新功能
NavType
的自定义子类现在可以替换serializeAsValue
,以将值序列化为字符串,从而允许(通过parseValue
)将序列化和反序列化对象完全封装在NavType
类中。StringType
现在替换了此方法,对给定的String
调用Uri.encode
。(Ie5213、b/247637434)- 现在,如果
NavigationUI
无法通过所选MenuItem
进行导航,它会提供日志。(I2af5a、b/247730357)
bug 修复
- 导航深层链接现在会被延迟解析,而不会在图表初始化时解析,这可以提升应用在启动时的性能。(Iab0ab)
- 修复了以下问题:在深层链接到具有默认 null 参数的目的地后,向上层导航会导致崩溃。(I51c24、b/243183636)
依赖项更新
- Navigation 对动态功能模块的支持现在依赖于精细的 Play Feature Delivery 库。(Ib4ddc)
- Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与版本 7.3.0 及更高版本兼容。(I47e49)
版本 2.6.0-alpha03
2022 年 10 月 24 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha03
。版本 2.6.0-alpha03 中包含这些提交内容。
bug 修复
- 从 Navigation
2.5.3
起:当Crossfade
没有可用于组合的目的地时,NavHost
将不会再导致NoSuchElementException
。现在它只会跳过组合操作。(Ieb46e、b/253299416) - 从 Navigation
2.5.3
起:修复了当目的地从返回堆栈中弹出时,系统仍记得已保存的 Compose 状态(例如,rememberSaveable
使用情况)而不移除此状态的问题。(I64949)
依赖项更新
- Navigation 现在依赖于 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)
bug 修复
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 文件的 activity 元素中使用确切字符串
${applicationId}
作为app:data
和app:dataPattern
属性中的占位符时,系统会在膨胀时自动使用上下文的packageName
填充占位符。(Iaabde、b/234223561) - 现在,尝试使用
navDeepLink
Kotlin DSL 创建空NavDeepLink
会导致 lint 警告,指出深层链接需要 uri、action 和/或 mimetype 才能有效。(I08d2f、b/154038883)
API 变更
- 添加了新的
NavDestination
扩展函数,用于将包含android:label="{arg}"
形式的参数的动态标签解析为字符串。通过将R.string
值解析为字符串值来支持ReferenceType
参数。(I07d89、b/236269380)
行为变更
- 现在,NavBackStackEntry 的
arguments
和传递给OnDestinationChangedListener
的arguments
只是您在导航到目的地时创建的不可变参数的副本。这意味着,对这些 Bundle 所做的任何更改都不会反映在对arguments
或其他OnDestinationChangedListener
实例的后续访问中。(I676f5)
bug 修复
- 从 Navigation
2.5.2
开始:现在,动态导航栏在导航到其他模块中的 Activity 目的地之前,会先正确地尝试安装这些目的地。(Ia2c16、b/240292838) - 从 Navigation
2.5.2
开始:现在,导航到同一目的地并将launchSingleTop
标志设置为 true 时,Navigation 会正确替换 fragment 实例。(I5a2f1、b/237374580) - 从 Navigation
2.5.2
开始:修复了因导航到双重嵌套图(其与新弹出的起始目的地共用一个父级)而引起的IllegalStateException
。(I9f7cb、b/243778589)
版本 2.5
版本 2.5.3
2022 年 10 月 24 日
发布了 androidx.navigation:navigation-*:2.5.3
。版本 2.5.3 中包含以下提交内容。
bug 修复
- 当
Crossfade
没有可用于组合的目的地时,NavHost
将不会再导致NoSuchElementException
。现在它只会跳过组合操作。(Ieb46e、b/253299416) - 修复了当目的地从返回堆栈中弹出时,系统仍记得已保存的 Compose 状态(例如,
rememberSaveable
使用情况)而不移除此状态的问题。(I64949)
Version 2.5.2
2022 年 9 月 7 日
发布了 androidx.navigation:navigation-*:2.5.2
。版本 2.5.2 中包含这些提交内容。
bug 修复
- 现在,动态导航栏在导航到其他模块中的 Activity 目的地之前,会先正确地尝试安装这些目的地。(Ia2c16、b/240292838)
- 现在,导航到同一目的地并将
launchSingleTop
标志设置为 true 时,Navigation 会正确替换 fragment 实例。(I5a2f1、b/237374580) - 修复了因导航到双重嵌套图(其与新弹出的起始目的地共用一个父级)而引起的
IllegalStateException
。(I9f7cb、b/243778589)
依赖项更新
- Navigation
2.5.2
Navigation 现在依赖于 Fragment1.5.2
。(aosp/2178734)
版本 2.5.1
2022 年 7 月 27 日
发布了 androidx.navigation:navigation-*:2.5.1
。版本 2.5.1 中包含这些提交内容。
bug 修复
- 使用保存在
Bundle
中的自定义参数类型时,Navigation Safe Args
将不会再在生成的类中导致废弃警告。(Id86ed、b/237725966)
依赖项更新
- Navigation 库现在依赖于 Lifecycle
2.5.1
。(Ib4451) - Navigation 库现在依赖于 Activity
1.5.1
。(I3efe8) - Navigation 库现在依赖于 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
。
Navigation SafeArgs
Navigation Safe Args
已将Android Gradle Plugin
依赖项升级为依赖于7.0.4
,从而不需要与7.0
之前的 AGP 版本兼容。- 添加了对要使用的命名空间 build.gradle 属性(而非 applicationId)的支持。
其他更改
visibleEntries
API 不再处于实验阶段,它提供了一个函数来检索根据NavController
其目的地当前可见的所有条目。
版本 2.5.0-rc02
2022 年 6 月 15 日
发布了 androidx.navigation:navigation-*:2.5.0-rc02
。版本 2.5.0-rc02 中包含这些提交内容。
bug 修复
- 修复了使用 Navigation Compose
NavHost
在底部目的地之间快速切换导致的崩溃问题。(I3979a、b/234054916) - 使用
applicationIdSuffix
和命名空间但不存在applicationId
时或当applicationId
和命名空间不同时,Navigation SafeArgs
不再崩溃。(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)
bug 修复
- 现在,系统会按照预期顺序处置
NavHost
和DialogHost
中的可组合项范围,即先处理内部可组合项,然后再处理外部可组合项。(I157e6) - Navigation SafeArgs 现在使用
ArgumentsGenerationTask
中的PathSensitivity.RELATIVE
来支持缓存可再定位性。这意味着现在可以在本地 build 中重复使用 CI build 中的缓存条目。(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 中包含这些提交内容。
bug 修复
DialogNavigator
现在会使用popWithTransition
来执行dismiss()
调用。这修复了在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
不再是实验性 API。(I4829f、b/225394514)
bug 修复
- NavHost 现在依赖于
NavController
中的visibleEntries
来确定要组合的条目。这意味着,在使用嵌套 NavHost 时,内部NavHost
现在应正确地呈现动画效果。(I4ba2b、b/225394514) NavController
提供的visibleEntries
StateFlow
现在基于条目最大生命周期状态,而不是当前生命周期状态。这意味着,即使navController
的主机生命周期降至 STARTED 以下,可见条目列表也将保持不变。(I9e2a8、b/225394514)SavedStateViewFactory
现在支持使用CreationExtras
,即使其通过SavedStateRegistryOwner
进行初始化也不受影响。如果提供 extra,则会忽略初始化的参数。(I6c43b、b/224844583)NavDeepLink
现在可以使用不含任何值的单个查询参数解析 URI。(I0efe8、b/148905489)- 现在,空字符串在深层链接中被视为有效参数。(I70a0d、b/217399862)
- 使用命名空间并且不存在
AndroidManifest.xml
时,Navigation Safe Args
将不会再崩溃。(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)
bug 修复
NavDeepLinks
现在可以正确支持路由/深层链接 URI 中所嵌入的编码的换行符。(I513d1、b/217815060)- 现在与
NavBackStackEntries
搭配使用来创建 ViewModel 时,CreationExtras
能够正常工作。(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 中包含这些提交内容。
bug 修复
- 从 Navigation
2.4.1
起:在搭配使用 ViewBinding 和嵌套图时,NavHostFragment
现在可以正确设置OnBackPressedDispatcher
。(Ifbb51、b/214577959) - 从 Navigation
2.4.1
起:当通过多个嵌套的NavGraph
实现深层链接时,返回堆栈现在可以正确包含中间起始目的地。(I504c0、b/214383060)
版本 2.5.0-alpha01
2022 年 1 月 26 日
发布了 androidx.navigation:navigation-*:2.5.0-alpha01
。版本 2.5.0-alpha01 中包含这些提交内容。
新功能
NavBackStackEntry
现在与 ViewModel CreationExtras 集成,后者是作为 Lifecycle2.5.0-alpha01
的一部分推出的。(Ib9fe2、b/207012490)
bug 修复
- 修复了访问从 Fragment 的
onCreate()
通过by navGraphViewModels()
创建的ViewModel
会失败并显示IllegalStateException
的问题。(I8a14d) NavDeepLink
无需再对参数进行两次不必要的解码,这意味着现在适当的参数会被传递到最终目的地。(I31b0a、b/210711399)
Safe Args
- Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle 插件 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 中包含这些提交内容。
bug 修复
- 从 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
向后移植:使用命名空间并且不存在AndroidManifest.xml
时,Navigation Safe Args
将不会再崩溃。(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 中包含这些提交内容。
bug 修复
- 在搭配使用 ViewBinding 和嵌套图时,
NavHostFragment
现在可以正确设置OnBackPressedDispatcher
。(Ifbb51、b/214577959) - 当通过多个嵌套的
NavGraph
实现深层链接时,返回堆栈现在可以正确包含中间起始目的地。(I504c0、b/214383060) - 从 Navigation
2.5.0-alpha01
向后移植:修复了访问从 fragment 的onCreate()
通过by navGraphViewModels()
创建的 ViewModel 会失败并显示IllegalStateException
的问题。(I8a14d) - 从 Navigation
2.5.0-alpha01
向后移植:NavDeepLink
无需再对参数进行两次不必要的解码,这意味着现在适当的参数会被传递到最终目的地。(I31b0a、b/210711399) - 从 Navigation
2.5.0-alpha01
向后移植:Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle 插件 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
子类)的类的可为 null 性。所有曾包含在-ktx
制品中的 Kotlin 扩展函数都已移到其各自的主要制品中。-ktx
制品将继续发布,但它完全是空的。 navigation-fragment
制品现在通过新的AbstractListDetailFragment
包含一个双窗格布局的预构建实现。此 fragment 使用SlidingPaneLayout
管理列表窗格(由您的子类提供)和详细信息窗格,后者采用NavHostFragment
作为其实现方法,如示例实现中所示。NavController
上的currentBackStackEntryAsFlow()
方法提供了一个Flow
(会在每次当前NavBackStackEntry
变化时发出)。此流程可以用作手动管理OnDestinationChangedListener
的替代方案。- NavController 现在可以通过实验性
visibleEntries
属性以StateFlow
形式检索所有可见NavBackStackEntry
实例的列表。 - 现在可以扩展
NavType
类以创建自定义 NavType。只有在程序化地(例如通过 Navigation Graph Kotlin DSL)构建导航图时,才支持自定义类型。 Navigation 现在提供
findStartDestination()
和getHierarchy()
API,可用于帮助实现自定义 NavigationUI。findStartDestination()
是针对NavGraph
的扩展函数,它会定位您导航到该图表时显示的实际起始目的地,即使startDestination
本身是嵌套的NavGraph
也是如此。getHierarchy()
是NavDestination
上的一个函数,可用于验证给定目的地是否在另一个目的地的层次结构中。val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
更新了
NavigationUI
方法,从接受BottomNavigationView
改为接受在 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
Kotlin 属性已被废弃,取而代之的是popUpToId
。 getStartDestination()
API 已废弃,取而代之的是getStartDestinationId()
。
与按 ID 导航不同,按路线导航与隐式深层链接遵循的规则相同,因为您可以直接导航到任何嵌套图表中的任何目的地,确保这些路线在多模块项目中可以使用,而无需向每个目的地明确添加外部可见的深层链接。
Navigation Compose
navigation-compose
制品集成了 Navigation Component 和 Jetpack Compose,且在应用中将 @Composable
函数作为目的地。
此版本提供了:
NavHost
可组合项,允许您使用composable
和dialog
目的地通过 Kotlin DSL 构建导航图,并且支持可选导航器,如 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 Navigation 指南。
多个返回堆栈
NavController 负责:管理目的地的返回堆栈,在您 navigate()
到相应目的地时将目的地添加到返回堆栈,以及在您调用 popBackStack()
或触发系统的返回按钮时移除目的地。我们扩展了导航图 XML 中现有的 NavOptions
类及到 <action>
元素的集成,以便支持保存和恢复返回堆栈。
作为此变更的一部分,onNavDestinationSelected()
、BottomNavigationView.setupWithNavController()
和 NavigationView.setupWithNavController()
的 NavigationUI
方法现在会自动保存并恢复弹出的目的地的状态,从而在不更改任何代码的情况下支持多个返回堆栈。将 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()
和新的过载用于采用了额外saveState
参数的setPopUpTo()
。NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);
对
popBackStack()
的程序化调用现在可以包含额外的saveState
参数。您可以使用
clearBackStack()
方法清除使用popBackStack()
或popUpToSaveState
保存的状态。
在所有情况下,NavController
都将保存并恢复每个 NavBackStackEntry
(包括任何已限定导航目的地范围的 ViewModel
实例)的状态。我们更新了 Navigator
API,使每个 Navigator
都支持保存和恢复自己的状态。
行为变更
NavDeepLinkBuilder
现在将PendingIntent.FLAG_IMMUTABLE
添加到了createPendingIntent()
返回的PendingIntent
中,从而确保此 API 在以 Android 12 为目标平台时按预期工作。- Navigation 现在依赖于 Lifecycle
2.3.1
,并且现在会将更新NavBackStackEntry
Lifecycle
的setGraph()
、popBackStack()
、navigateUp()
和navigate()
方法标记为@MainThread
,从而使 Navigation 与 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)
bug 修复
- 深层链接将不再忽略值与占位符名称相同的参数。(If8017、b/207389470)
NavController
恢复后,使用转换弹出嵌套目的地时,NavController
将不再崩溃。(I0f7c9、b/205021623)- 现在,使用无效
startDestination
时的错误消息将默认为起始目的地的路线(如果有)。(I86b9d、b/208041894)
Navigation Compose bug 修复
- 修复了由于使用底部导航菜单项在起始目的地和其他目的地之间快速切换而导致的潜在崩溃。(Ic8976、b/208887901)
- 现在,在配置发生变化或进程终止后,对话框目的地可在屏幕顶部正确恢复。(I4c0dc、b/207386169)
- 修复了以下问题:对话框关闭后,尝试从对话框的
NavBackStackEntry
获取ViewModel
会失败。(I6b96d、b/206465487) - 修复了以下问题:将
activity
目的地与 Navigation Compose 的NavHost
一起使用时,会导致无限重组。(I8f64c) - 修复了 Navigation Compose 中的一个漏洞,即在配置发生变化或进程终止后,它会保留对旧 activity 的引用。(I4efcb、b/204905432)
Safe Args bug 修复
SafeArgs
在进程终止后尝试恢复自定义 parcelable 数组时,不会再崩溃。(I618e8、b/207315994)- 修复了 Safe Args 中的一个 bug,该 bug 会导致布尔数组不能使用
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)
bug 修复
- 修复了在将
NavHost
直接添加到 activity 的setContent()
时,NavBackStackEntries 移至Lifecycle.State.STARTED
后被下推到Lifecycle.State.CREATED
的问题。(Ia5ac1、b/203536683) - 修复了一个竞态条件,即在实际显示对话框之前从返回堆栈中抛出
DialogFragment
目的地实际上并不会关闭对话框,导致出现崩溃,错误对话框只能由用户手动关闭。(I687e5) - 修复了即使您实际上并未
navigate()
到导航图,NavigationUI
上的onNavDestinationSelected
API 也会返回true
的问题。现在,该 API 使用setupWithNavController
在内部使用的相同逻辑,通过目的地hierarchy
仅选择与当前目的地相关联的MenuItem
。(I2b053)
版本 2.4.0-beta01
2021 年 10 月 27 日
发布了 androidx.navigation:navigation-*:2.4.0-beta01
。版本 2.4.0-beta01 中包含这些提交内容。
新功能
- 现在,您可以将
by navGraphViewModel
与路线一起使用,作为使用 ID 的替代方法,以便更好地支持将 Navigation Kotlin DSL 与 Fragment 配合使用。(I901e3、b/201446416)
API 变更
visibleEntries
API 目前处于实验阶段。(I93f6f)
bug 修复
- 过渡因在相同屏幕之间来回切换而中断时,系统将不再销毁 ViewModel(Id52d8、b/200817333)
- 向
NavDestination
添加深层链接时,可为 null 的NavDeepLink
参数不再需要默认值。(I5aad4、b/201320030) - 现在,系统不再将生命周期不同的 NavBackStackEntry 视为等同。也就是说,使用 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)
bug 修复
- 重新创建 activity 时,Dynamic Navigation 将不会再崩溃。(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
)的一部分。这将需要更新 import 语句,才能继续使用此函数。(I1d095)
行为变更
- 生成参数时,Safe Args 现在会将不含默认值的参数放在具有默认值的参数之前。(I89709、b/198493585)
bug 修复
- 在使用 Navigation Compose 时,NavGraph 只有在其所有子级都处于
DESTROYED
状态后,才会处于DESTROYED
状态。(I86552、b/198741720) - 可为 null 的
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。只有在程序化地(例如通过 Navigation Graph Kotlin DSL)构建导航图时,才支持自定义类型。(I78440、b/196871885)
行为变更
- 生成操作时,从 Safe Args 生成的 Kotlin 代码现在会将不具有默认值的参数放在具有默认值的参数之前。(Idb697、b/188855904)
- 深层链接现在会验证
Uri
中是否存在所有必需的参数(不存在默认值的参数)。(#204、b/185527157)
bug 修复
- 将 composable() 内的
getBackStackEntry
和previousBackStackEntry
与remember()
结合使用不会再导致因返回堆栈上没有目的地而出现异常。(I75138、b/194313238) - 在更改返回堆栈参数和使用
launchSingleTop=true
时,Navigation Compose 现在会正确进行重组。(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 中包含这些提交内容。
bug 修复
- 现在,Navigation Compose 可在配置更改后以及使用多个返回堆栈功能期间更改图时正确保存状态。(If5a3d、b/195141957)
- 将 Navigation Compose 与多个返回堆栈搭配使用时,重新选择同一标签页不会再生成空白屏幕。(I860dc、b/194925622)
NavHost
现在会观察NavBackStackEntry
的Lifecycle.State
中的更改,这意味着当生命周期更改时,在 fragment 中使用NavHost
现在会正确重组,而不是生成空白界面。(I4eb85、b/195864489)- 修复了以下问题:重新创建 activity 后(即配置更改后),关闭
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)
bug 修复
- 在弹出某个导航图的最后一个目的地时,系统不会再抛出
ClassCastException
。(If0543、b/172112072、b/194301889) - 修复了以下问题:在没有
Uri
的情况下添加深层链接时,以及在通过路由或深层链接进行导航时,会发生NullPointerException
。(938a0c、b/193805425) - 修复了 Navigation Compose 中添加了深层链接的
NavBackStackEntry
无法达到RESUMED
状态的问题。(I192c5) - 修复了以下问题:弹出对话框目的地不会更新 NavController 的系统返回按钮处理情况,这可能会导致 NavController 拦截返回按钮,即使该按钮没有任何要弹出的返回堆栈。(aosp/1782668)
版本 2.4.0-alpha05
2021 年 7 月 21 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha05
。版本 2.4.0-alpha05 中包含这些提交内容。
行为变更
- 在目的地之间导航时,Navigation Compose 的
NavHost
现在始终使用淡入淡出。(I07049、b/172112072) - 您现在可以更改 NavHost 的图表。具有相同 startDestination 的图表和图表中的目的地将被视为相等,并且不会清除
NavController
返回堆栈。(I0b8db、b/175392262)
bug 修复
- 修复了从附加到
NavBackStackEntry
的LifecycleObserver
中调用popBackStack()
时因 NavController 状态的可重入更新而出现的NoSuchElementException
。(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
包含一个双窗格布局的预构建实现。此 fragment 使用SlidingPaneLayout
管理列表窗格(由您的子类提供)和详细信息窗格,后者采用NavHostFragment
作为其实现方法,如示例实现中所示。(Iac4be、b/191276636)navigation-compose
制品的NavHost
现在除了支持composable
目的地之外,还支持dialog
目的地。这些对话框目的地会显示在各自对应的可组合项Dialog
内,并悬浮在当前的composable
目的地上方。(I011d0)
val navController = rememberNavController()
Scaffold { innerPadding ->
NavHost(navController, "home", Modifier.padding(innerPadding)) {
composable("home") {
// This content fills the area provided to the NavHost
HomeScreen()
}
dialog("detail_dialog") {
// This content will be automatically added to a Dialog() composable
// and appear above the HomeScreen or other composable destinations
DetailDialogContent()
}
}
}
API 变更
NavigatorState
中的add
函数已重命名为push
。当前对add()
的所有调用都需要更改为 push()。(Ie89fc、b/172112072)- 自定义
Navigator
实例现在可以使用NavigatorState
中的pushWithTransaction
和popWithTransition
API 对目的地异步执行入栈或出栈操作。请注意,此 API 尚未用于任何已包含的导航器。(Ic4d7c、b/172112072)
行为变更
NavDeepLinkBuilder
现在将PendingIntent.FLAG_IMMUTABLE
添加到了createPendingIntent()
返回的PendingIntent
中,从而确保此 API 在以 Android 12 为目标平台时按预期工作。(If8c52)
bug 修复
- 修复了
<include-dynamic>
存在的以下问题:传递给图表的参数无法正确传递给动态包含的图表。(I3e115) - 修复了使用默认值为
@null
的string[]
参数导航到目的地时抛出NullPointerException
的问题。(I1fbe8) - 为
@Navigator.Name
添加了 ProGuard 规则,修复了使用 R8 3.1 完整模式时出现的问题。(I2add9、b/191654433) - 使用
1.5.0
之前的Kotlin
版本构建应用时,SafeArgs 不会再失败。(Icd1ff、b/190739257)
版本 2.4.0-alpha03
2021 年 6 月 16 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha03
。版本 2.4.0-alpha03 中包含这些提交内容。
bug 修复
- 修复了需要调用两次
navigate()
才能转到包含的动态图的问题。(I7785c、b/188859835) - 修复了 Navigation
2.4.0-alpha01
中引入的如下回归问题:当您位于顶层目的地时,setupActionBarWithNavController()
无法正确移除向上图标。(I5d443、b/189868637) - 修复了在先弹出 NavController 的根图后调用
popBackStack()
时出现的IllegalStateException
。(I2a330、b/190265699) - 现在,在使用
navigation-common
或任何依赖于它的制品时,可以正确对by navArgs()
应用 ProGuard 规则。(I68800、b/190082521) - 在第一次收到回调时调用
navigate()
的OnDestinationChangedListener
现在可以正确获取包含要转到的目的地的第二次回调。(Ie5f9e、b/190228815) - 在将 Safe Args 与动态功能模块和 AGP 7.0 及更高版本结合使用时,Safe Args 不再崩溃。(I69518、b/189966576)
已知问题
- 由于依赖于旧版 Kotlin,因此在使用 Gradle
6.7.0
时,Safe Args 将运行失败,并显示Unable to find method ‘’java.lang.String kotlin.text.CarsKt.titleCase(char, java.util.Locale)’’
错误。如需解决此问题,请更新为使用 Gradle 7.0。(b/190739257)
版本 2.4.0-alpha02
2021 年 6 月 2 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha02
。版本 2.4.0-alpha02 中包含这些提交内容。
新功能
- activity、fragment 和 dialog 目的地以及整个 DynamicNavigation Kotlin DSL 现在支持路线。(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 }
更新了 NavigationUI 方法,从接受
BottomNavigationView
改为接受在 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)
bug 修复
- 现在,如果对话框是通过按系统返回按钮或点击对话框外的任意位置来关闭的,
DialogFragmentNavigator
会使用NavigatorState.pop()
API 来通知NavController
,从而确保NavController
状态与导航器的状态始终保持同步。(I2ead9) 在使用
onDestinationChanged
回调操控OnDestinationChangedListeners
的列表时,Navigation 不再提供ConcurrentModificationException
。(Ib1707、b/188860458)在 Kotlin 中尝试生成方向属性时,Safe Args 不再崩溃。(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
变化时发出)。此流程可以用作手动管理OnDestinationChangedListener
的替代方案。(I19c4a、#89、b/163947280)
多个返回堆栈
NavController 负责:管理目的地的返回堆栈,在您 navigate()
到相应目的地时将目的地添加到返回堆栈,以及在您调用 popBackStack()
或触发系统的返回按钮时移除目的地。我们扩展了导航图 XML 中现有的 NavOptions
类及 <action>
条目中的集成,以便支持保存和恢复返回堆栈。(b/80029773)
作为此变更的一部分,onNavDestinationSelected()
、BottomNavigationView.setupWithNavController()
和 NavigationView.setupWithNavController()
的 NavigationUI
方法现在会自动保存并恢复弹出的目的地的状态,从而在不更改任何代码的情况下支持多个返回堆栈。将 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()
和新的过载用于采用了额外saveState
参数的setPopUpTo()
。NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(navController.getGraph().getStartDestinationId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);
对
popBackStack()
的程序化调用现在可以包含额外的saveState
参数。
在所有情况下,NavController
都将保存并恢复每个 NavBackStackEntry
(包括任何已限定导航目的地范围的 ViewModel
实例)的状态。我们更新了 Navigator
API,使每个 Navigator
都支持保存和恢复自己的状态。
我们还更新了 Navigation Compose 中 composable
目的地所用的 ComposeNavigator
以及包含 Fragment 的 Navigation 中的 <fragment>
目的地所用的 FragmentNavigator
和 DynamicFragmentNavigator
,以便使用新的导航器 API 并支持保存和恢复状态。
导航路线
路线是用于标识目的地的 String
,其具有唯一性。此概念之前仅用于 Navigation Compose 中,但现在已逐渐成为核心 Navigation API 的一部分。在通过 Navigation Kotlin DSL 构建图表时,这可以作为使用整数 ID 的替代方案。(b/172823546)
所有过去仅采用 ID 的 API 现在都具有采用路线 String
的过载。这包括 navigate()
、popBackStack()
、popUpTo()
和 getBackStackEntry()
。
这产生了一些 API 影响:
- Kotlin DSL 中的
popUpTo
Kotlin 属性已被废弃,取而代之的是popUpToId
。(I59c73、b/172823546) getStartDestination()
API 已被废弃,取而代之的是getStartDestinationId()
。(I0887f、b/172823546)
对于从旧版 Navigation Compose 升级到 Navigation Compose 2.4.0-alpha01
的开发者来说,这意味着不再需要以下对扩展方法的导入,应该将其移除:
import androidx.navigation.compose.navigation
import androidx.navigation.compose.createGraph
import androidx.navigation.compose.getBackStackEntry
import androidx.navigation.compose.navigate
import androidx.navigation.compose.popUpTo
KEY_ROUTE
参数已被 NavDestination
中的 route
属性取代,这使您可以直接调用 navBackStackEntry.destination.route
。
API 变更
- 所有 Navigation 制品都已使用 Kotlin 重写。这提升了使用泛型(例如
NavType
子类)的类的可为 null 性。所有曾包含在-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
扩展,它会向相关的 CompositionLocal 提供NavBackStackEntry
。(#175、b/187229439)
Safe Args
Safe Args 现在会为每个
NavArgs
类生成一个fromSavedStateHandle()
方法。(#122、b/136967621)class HomeViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { // Create a HomeDestinationArgs class with type safe accessors for each argument // defined on your destination private val args = HomeDestinationArgs.fromSavedStateHandle(savedStateHandle) }
更新了 Safe Args,使其依赖于 KotlinPoet
1.8.0
。(#172、b/183990444)
行为变更
- Navigation 现在依赖于 Lifecycle
2.3.1
,并且现在会将更新NavBackStackEntry
Lifecycle
的setGraph()
、popBackStack()
、navigateUp()
和navigate()
方法标记为@MainThread
,从而使 Navigation 与 Lifecycle2.3.0
中引入的主线程强制执行保持一致。(b/171125856) - 现在,解析来自深层链接的枚举参数时不区分大小写,举个例子:即使枚举值为
RED
,深层链接http://www.example.com/red
也会匹配深层链接www.example.com/{color}
。(#152、b/135857840)
Compose 兼容性
androidx.navigation:navigation-compose:2.4.0-alpha01
仅与 Compose 版本1.0.0-beta07
及更高版本兼容。
bug 修复
- 修复了以下问题:末尾的参数占位符会优先于后缀完全匹配的深层链接。(#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) - 感谢 jossiwol 引入了新的
NavBackStackEntry#provideToCompositionLocals
扩展,从而向相关的 CompositionLocal 提供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
,后者会向下传递到封装目的地可组合项的可组合容器。(I85aca、b/175125483)
bug 修复
- 现在,即使未找到
OnBackPressedDispatcherOwner
(例如在预览NavHost
时),NavHost
也可正常运行。(I7d8b4) - Navigation Compose 现在依赖于 Navigation
2.3.5
,修复了在NavHost
目的地内使用BackHandler
时出现的问题。(I7e63b、b/182284739)
版本 1.0.0-alpha09
2021 年 3 月 10 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha09
。版本 1.0.0-alpha09 中包含这些提交内容。
API 变更
LocalViewModelStoreOwner.current
现在会返回可为 null 的ViewModelStoreOwner
,以更好地确定ViewModelStoreOwner
在当前组合中是否可用。如果未设置ViewModelStoreOwner
,则需要ViewModelStoreOwner
的 API(例如viewModel()
和NavHost
)仍会抛出异常。(Idf39a)
bug 修复
- 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 中包含这些提交内容。
bug 修复
- 修复了以下问题:配置更改或进程终止和重新创建后,
popBackStack()
和navigateUp()
无法工作。(Icea47、b/173281473) - 现在,导航至 NavHost 中的嵌套图表可以正常工作。(I0948d、b/173647694)
版本 1.0.0-alpha02
2020 年 11 月 11 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha02
。版本 1.0.0-alpha02 中包含这些提交内容。
API 变更
- Navigation Compose 现已支持使用 popUpTo 和 launchSingleTop 操作所需的 NavOptions(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 Component 和 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 中包含这些提交内容。
新功能
- 使用
NavDeepLinkRequest
或Uri
进行导航时,您现在可以访问生成的目的地中的Uri
、操作和 MIME 类型,方法是通过KEY_DEEP_LINK_INTENT
,获取来自参数的 intent,对应于已提供的外部深层链接功能。(I975c3、b/181521877)
bug 修复
OnBackPressedCallbacks
已添加至带有NavBackStackEntry
的调度程序,现在,如果 Activity Lifecycle 先为STOPPED
,然后重新变为STARTED
,则 LifecycleOwner 会正确拦截返回操作。(Iff94f, b/182284739)- 深层链接域名解析现在不区分大小写,因此确保
www.example.com
与www.example.com
和www.Example.com
都能匹配。请注意,查询参数名称仍区分大小写。(#144、b/153829033) - 修复了当某个目的地具有多个不可为 null 的默认参数,且导航到该目的地时只覆盖这些参数的子集时,可能出现的
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)
bug 修复
- 修复了在利用 Navigation 对动态功能的支持时安装进度卡住的问题。(Ib27a7、b/169636207)
- 现在,使用已设置的同一对象调用
setViewModelStore
或setLifecycleOwner
将成为一项空操作(Idf491、b/177825470) - 现在,使用 java 时,Safe-Args 会在正确的方法上添加抑制注解。(I8fbc5、b/179463137)
外部贡献
- 感谢
JvmName
提供的拉取请求,这可确保ReferenceType
参数现在作为深层链接 URI 的一部分发送时可以得到正确解析。(#127、b/179166693) - 感谢
tatocaster
提供的拉取请求,这可以让具有app:argType=”float”
的参数的defaultValue
现在支持整数默认值。(#117、b/173766247)
版本 2.3.3
版本 2.3.3
2021 年 1 月 27 日
发布了 androidx.navigation:navigation-*:2.3.3
。版本 2.3.3 中包含这些提交内容。
bug 修复
- 现在,在 NavBackStackEntry 的
Lifecycle
变为CREATED
之前弹出NavBackStackEntry
时,不会再发生崩溃。(Ie3ba3) - 修复了由 b/171364502 引起的回归问题,具体为导航至动画资源值为
0
的 activity 会导致ResourceNotFoundException
错误。(I7aedb、b/176819931)
版本 2.3.2
版本 2.3.2
2020 年 12 月 2 日
发布了 androidx.navigation:navigation-*:2.3.2
。版本 2.3.2 中包含这些提交内容。
bug 修复
- 修复了
NavigationUI
中的一个回归问题,即使用带有onNavDestinationSelected
的<activity>
目标位置无法导航到 Activity。(I22e34、b/171364502) - 修复了
navigation-dynamic-features-fragment
会导致多次导航到新安装的目标位置的问题。(aosp/1486056、b/169636207) - 修复了以下问题:使用
launchSingleTop
时,默认参数无法发送到OnDestinationChangedListener
实例。(I2c5cb) - 修复了以下问题:导航到嵌套导航图时,系统不会在返回堆栈上创建新的图表实例。(Ifc831)
- 修复了以下问题:将
navigate()
与已移除导航图中的最后一个目的地的popUpTo
一起使用时,不会立即销毁并从返回堆栈中移除导航图本身。(I910a3) - Navigation SafeArgs 现在使用 KotlinPoet 版本 1.7.2,后者添加了对 Kotlin 的显式 API 模式的支持。(I918b5)
- 除了对 Fragment 层次结构和 Fragment 的视图层次结构的现有检查以外,
NavHostFragment.findNavController(Fragment)
现在还会检查 DialogFragment 的 root decor 视图。这样,您便可以通过FragmentScenario
和Navigation.setViewNavController()
测试使用 Navigation 的对话框 fragment。(I69e0d)
版本 2.3.1
版本 2.3.1
2020 年 10 月 14 日
发布了 androidx.navigation:navigation-*:2.3.1
。版本 2.3.1 中包含这些提交内容。
新功能
- 默认 Animator 资源已添加到 Navigation UI,建议使用该资源,而不是默认动画资源。(b/167430145)
- NavOptions 现在替换了哈希代码和 equals 方法 (b/161586466)
- 现在 Navigation 会在“无带 ID 的目标”IllegalArgumentException 中包含当前目标,这应该会改进开发者的调试体验。(b/168311416)
bug 修复
- Safe Args 将不再封装返回行,即使生成的参数类名称的长度超过 100 个字符也是如此。(b/168584987)
依赖项变更
navigation-ui
现在依赖于 DrawerLayout 1.1.1,从而确保即使是在使用LOCK_MODE_LOCKED_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
,可用于设置当前目标并在导航操作后验证返回堆栈。如需了解详情,请参阅测试导航。 - 返回结果:现在,通过与 Navigation 返回堆栈中的每个目标相关联的
NavBackStackEntry
,您可以使用SavedStateHandle
,它适用于存储少量应与特定返回堆栈条目相关联的已保存状态。如需了解详情,请参阅向上一个目的地返回结果。 - 对
Openable
的NavigationUI
支持:使用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>
元素或您的自定义<action>
中包含您的 MIME 类型。您必须手动在清单中添加相应的<intent-filter>
。
版本 2.3.0-rc01
2020 年 6 月 10 日
发布了 androidx.navigation:navigation-*:2.3.0-rc01
。版本 2.3.0-rc01 中包含这些提交内容。
bug 修复
- 修复了在使用
singleTop
将不含参数的目标的实例替换为包含参数的其他实例时发生的NullPointerException
。(b/158006669) NavController
抛出的所有destination is unknown
异常现在包含额外的调试信息,可帮助确定NavController
的状态。(b/157764916)
版本 2.3.0-beta01
2020 年 5 月 20 日
发布了 androidx.navigation:navigation-*:2.3.0-beta01
。版本 2.3.0-beta01 中包含这些提交内容。
bug 修复
- 修复了进程终止后
NavBackStackEntry
的Lifecycle
无法正确更新的问题。(b/155218371) - 现在进程终止后,可向在调用
setGraph()
之前注册的OnDestinationChangedListener
实例正确发送恢复的目标。(b/155218371) - 现在使用
singleTop
时,NavBackStackEntry
会正确更新其参数,且更新后的参数会发送给所有OnDestinationChangeListener
实例。(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 变更
- 极大地扩展了对 Dynamic Navigation 目标的 Kotlin DSL 支持。(b/148969800)
bug 修复
- 修复了使用嵌套起始目标时深层链接 intent 会被忽略的问题。(b/154532067)
版本 2.3.0-alpha05
2020 年 4 月 15 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha05
。版本 2.3.0-alpha05 中包含这些提交内容。
新功能
- 对于使用
<include-dynamic>
的所包含动态图,您不需要再指定app:graphPackage
,只需在点后为applicationId
添加moduleName
后缀,系统即会使用默认的软件包。如果您需要自定义graphPackage
,现在可以使用${applicationId}
占位符。(b/152696768) - Navigation Graph Kotlin DSL 现在可公开操作的
defaultArguments
Map
,从而镜像在 Navigation XML 文件中为<action>
元素设置默认值的功能。(b/150345605)
bug 修复
- 从 Navigation 2.2.2 开始:修复了如果 Activity 中有多个
NavHostFragment
实例,深层链接到图的起始目的地时的IllegalStateException
。(b/147378752)
依赖项更新
- Navigation 现在依赖于 Fragment
1.2.4
。(aosp/1277325) - Dynamic Navigation 现在依赖于 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 的功能模块 Activity 和 Fragment 目标的支持。(b/148969800)
API 变更
DynamicExtras
类不再使用构建器模式,现在可以直接构建。(aosp/1253671)- 现在,
DynamicActivityNavigator
可以在其构造函数(而非Activity
)中获取Context
。(aosp/1250252)
bug 修复
NavigationUI
不再忽略空标签(即包含android:label=””
的目的地),现在可以正确将标题设置为空字符串。(b/148679860)
依赖项更新
- Navigation Dynamic Features 制品现在依赖于 Play Core
1.6.5
。(b/149556401)
版本 2.3.0-alpha03
2020 年 3 月 4 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha03
。版本 2.3.0-alpha03 中包含这些提交内容。
API 变更
- 现在,
AppBarConfiguration
不再依赖于具体的DrawerLayout
类,而是使用 CustomView1.1.0-alpha02
中引入的Openable
接口(从 DrawerLayout1.1.0-alpha04
开始,DrawerLayout
会实现该接口),从而允许您将Openable
的自定义实现与NavigationUI
一起使用。(b/129030452)
bug 修复
- 现在,
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
,它适合存储少量应与特定返回堆栈条目相关联的已保存状态。有关示例用例,请参阅返回结果。(b/79672220)
API 变更
- 添加了
getCurrentBackStackEntry()
和getPreviousBackStackEntry()
的简便方法,以便更轻松地检索NavBackStackEntry
获取当前和之前的目的地。(b/79672220)
bug 修复
- 现在,在您自己的任务堆栈上启动应用时,
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
类。该类提供了测试 Navigation 时使用模拟NavController
的替代方法,该方法可让您设置当前目的地,并在导航操作后验证返回堆栈。(b/140884273) - 新的
navigation-dynamic-features-fragment
(及其传递依赖项navigation-dynamic-features-runtime
)可让您通过<include-dynamic>
添加功能模块中的目标或整个导航图,从而在导航到相应目标时,实现按需功能模块无缝安装。如需了解详情,请参阅使用功能模块进行导航。(b/132170186)
bug 修复
- 从 Navigation
2.2.1
起:没有查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随{argument}
元素或不匹配深层链接。(b/147447512) - 从 Navigation
2.2.1
开始:更新了DrawerArrowDrawable
的navigation-ui
ProGuard 规则,以确保不需要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 中包含这些提交内容。
bug 修复
- 修复了如果 Activity 中有多个
NavHostFragment
实例,深层链接到图的起始目的地时的IllegalStateException
。(b/147378752) NavigationUI
不再忽略空标签(即包含android:label=””
的目的地),现在可以正确将标题设置为空字符串。此修复已在之前的 Navigation 2.3.0-alpha04 中发布。(b/148679860)- 现在,
navigation-common-ktx
ProGuard 规则只会正确保留使用的NavArgs
类,而非所有NavArgs
实例。此修复已在之前的 Navigation 2.3.0-alpha03 中发布。(b/150213558
依赖项更新
- 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 中包含这些提交内容。
bug 修复
- 没有查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随
{argument}
元素或不匹配深层链接。(b/147447512) - 更新了
DrawerArrowDrawable
的navigation-ui
ProGuard 规则,以确保不需要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 集成:现在将
by navGraphViewModels()
或ViewModelProvider
构造函数与NavController.getBackStackEntry()
或NavController.getViewModelStoreOwner()
返回的ViewModelStoreOwner
一起使用时,会使用SavedStateViewModelFactory
作为默认出厂设置。 - 深层链接的查询参数支持:具有查询参数的深层链接现在支持重新排序的查询参数;现在在匹配深层链接时,具有默认值或可为 null 的参数为可选参数。
- 改进了动画支持:
NavHostFragment
现在使用 Fragment 1.2.0 中的FragmentContainerView
,这解决了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。
版本 2.2.0-rc04
2019 年 12 月 18 日
发布了 androidx.navigation:navigation-*:2.2.0-rc04
。版本 2.2.0-rc04 中包含这些提交内容。
bug 修复
- 调整了
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 中包含这些提交内容。
bug 修复
- 修复了以查询参数和一个实参作为路径最后一部分时存在的深层链接解析问题,此问题会导致最终路径实参中的多个字符无法解析。(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)
bug 修复
- 修复了以下问题:如果还指定了查询参数,深层链接路径中的实参将被忽略。(b/141505755)
- 如果没有额外服务,
Activity
上的navArgs()
Kotlin 扩展程序现在具有更明确的错误消息。(b/141408999) - Safe Args 生成的
Directions
Java 类现在包含默认值。(b/141099045) - Safe Args 生成的
Args
Java 类现在包含默认值。(b/140123727) - 如果使用
Toolbar
,在两个顶级目标之间移动时,NavigationUI
不再以动画形式显示文本更改。(b/140848160)
版本 2.2.0-alpha03
2019 年 9 月 18 日
发布了 androidx.navigation:navigation-*:2.2.0-alpha03
。版本 2.2.0-alpha03 中包含这些提交内容。
行为变更
- 在调用
setGraph
之后调用setViewModelStore()
现在会导致出现IllegalStateException
。在初始设置中,此项应始终由NavHost
进行设置,以确保所有NavBackStackEntry
实例均具有用于ViewModel
实例的一致存储。(aosp/1111821)
bug 修复
- 修复了在使用
ViewModelStore
实例(附加到多个不同导航图表限定范围的ViewModel
实例)时出现的ConcurrentModificationException
。(aosp/1112257)
版本 2.2.0-alpha02
2019 年 9 月 5 日
发布了 androidx.navigation:navigation-*:2.2.0-alpha02
。点击此处可查看此版本中包含的提交内容。
新功能
- 具有查询参数的深层链接现在支持重新排序的查询参数;匹配深层链接时,具有默认值或可为 null 的实参现在是可选的。(b/133273839)
- 您现在可以调用
NavController.getBackStackEntry()
,在返回堆栈中传入目标或导航图表的 ID。除了提供用于启动该目标的参数,返回的NavBackStackEntry
还提供导航驱动的LifecycleOwner
、ViewModelStoreOwner
(与NavController.getViewModelStoreOwner()
返回的内容相同)和SavedStateRegistryOwner
。(aosp/1101691、aosp/1101710)
bug 修复
- 修复了将
NavHostFragment
添加到ViewPager2
失败并出现IllegalArgumentException
的问题。(b/133640271) NavInflater
现在可以避免不必要地调用getResourceName()
,从而将扩充时间最多缩短 40%。(b/139213740)
版本 2.2.0-alpha01
2019 年 8 月 7 日
发布了 androidx.navigation:navigation-*:2.2.0-alpha01
。点击此处可查看此版本中包含的提交内容。
新功能
SavedStateViewModelFactory
现在是将by navGraphViewModels()
或ViewModelProvider
构造函数与NavController.getViewModelStoreOwner()
返回的ViewModelStoreOwner
一起使用时所用的默认出厂设置。(b/135716331)
API 变更
- 从 Navigation
2.1.0-rc01
开始:移除了2.1.0-alpha02
中引入的NavController
上已废弃的getViewModelStore()
API。(aosp/1091021)
bug 修复
NavHostFragment
现在使用FragmentContainerView
,修复了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。(b/137310379)
版本 2.1.0
版本 2.1.0
2019 年 9 月 5 日
发布了 androidx.navigation:navigation-*:2.1.0
。点击此处可查看此版本中包含的提交内容。
自 2.0.0 以来的重要变更
- 将 ViewModel 范围限定为导航图表:您现在可以通过针对使用
-ktx
库的 Kotlin 用户的by navGraphViewModels()
属性委派或使用添加到NavController
的getViewModelStoreOwner()
API,创建在导航图表级别限定范围的 ViewModel。如需了解详情,请参阅在目标之间共享与界面相关的数据。 - dialog 目标:您现在可以创建
<dialog>
目标,当您navigate
到这些目标时,系统会显示DialogFragment
。NavHostFragment
默认支持 dialog 目标。如需了解详情,请参阅从 DialogFragment 创建目标。 - 通过 Uri 导航:您现在可以使用
Uri
进行navigate
,它使用您已添加到目标的<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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 移除了在
2.1.0-beta01
中引入的意外 jacoco 依赖项。(b/137782950)
版本 2.1.0-beta01
2019 年 7 月 17 日
发布了 androidx.navigation:*:2.1.0-beta01
。点击此处可查看此版本中包含的提交内容。
新功能
- 将
setupWithNavController()
与Toolbar
或CollapsingToolbarLayout
结合使用时,NavigationUI
现在会以动画形式显示向上按钮的移除。(b/131403621)
bug 修复
- 修复了通过
findNavController()
使用具有相同容器的多个 NavHostFragment 时出现的时间问题。(b/136021571)
版本 2.1.0-alpha06
2019 年 7 月 2 日
发布了 androidx.navigation:*:2.1.0-alpha06
。点击此处可查看此版本中包含的提交内容。
新功能
- NavHostFragment 使用的
app:navGraph
属性现在已移至navigation-runtime
制品。可通过 XML 添加的自定义导航器应使用此属性与导航编辑器的“托管方”面板相集成。(b/133880955)
API 变更
- 废弃了
NavController
上的getViewModelStore()
API,换用新的getViewModelStoreOwner()
方法,该方法可返回ViewModelStoreOwner
。(aosp/987010) - 浮动窗口目标(例如
<dialog>
目标)的实现已泛化为标记接口FloatingWindow
,现在所有<dialog>
目标都可以实现该接口。用于与顶部应用栏交互的 NavigationUI 方法现在会忽略FloatingWindow
目标。(b/133600763)
行为变更
- Navigation 现在可以正确地使其状态与使用
<dialog>
目标时屏幕上显示的状态保持同步。因此,当您导航到非 dialog 和非 activity 目标(例如<fragment>
目标)时,Navigation 现在会自动弹出<dialog>
目标。(b/134089818)
bug 修复
- Navigation 现在可以禁止在处理深层链接时重新创建 activity 时出现的动画,从而修复了视觉闪烁问题。(b/130362979)
- 修复了由于添加了初始 fragment 而弹出 Fragment 时,Navigation 返回堆栈会不同步的 bug。(b/133832218)
版本 2.1.0-alpha05
2019 年 6 月 5 日
发布了 androidx.navigation:*:2.1.0-alpha05
。点击此处可查看此版本中包含的提交内容。
API 变更
NavController
上与托管方相关的 API 已重命名并移至NavController
的新子类NavHostController
。(aosp/966091)NavController
setHostOnBackPressedDispatcherOwner()
方法替换为NavHostController
的setOnBackPressedDispatcher()
方法,现在要求您在调用该方法之前先调用setLifecycleOwner()
。(aosp/965409)NavHostController
现在包含enableOnBackPressed(boolean)
方法,该方法替换了先前由setHostOnBackPressedDispatcherOwner()
返回的NavHostOnBackPressedManager
类。(aosp/966091)
bug 修复
- 修复了通过 URI 导航后返回堆栈不正确的问题。(b/132509387)
- NavController 自动处理的深层链接现在仅触发一次。(b/132754763)
版本 2.1.0-alpha04
2019 年 5 月 16 日
发布了 androidx.navigation:*:2.1.0-alpha04
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 在拦截系统返回按钮事件时,
NavHostFragment
正确遵守app:defaultNavHost
,从而修复了 Navigation2.1.0-alpha03
中出现的回归问题。b/132077777 DialogFragmentNavigator
现在可以正确处理popBackStack()
和navigateUp()
操作。b/132576764- 修复了在嵌套图表之间反复导航时出现的
IllegalStateException: unknown destination during restore
问题。b/131733658
版本 2.1.0-alpha03
2019 年 5 月 7 日
发布了 androidx.navigation:*:2.1.0-alpha03
。点击此处可查看此版本中包含的提交内容。
已知问题
- 尽管使用了
app:defaultNavHost="false"
,NavHostFragment 仍会拦截系统返回按钮 b/132077777
新功能
- 您现在可以创建
<dialog>
目标,当您navigate
到这些目标时,系统会显示DialogFragment
目标。NavHostFragment
默认支持 dialog 目标。b/80267254 - 除了使用资源 ID 或
NavDirections
实例调用navigate
之外,您现在还可以通过Uri
进行导航,它使用您已添加到目标的<deepLink>
导航到相应的目标。b/110412864
行为变更
- NavigationUI 提供的默认动画已从 400 毫秒缩短到 220 毫秒,以匹配 Activity 和 Fragment 的默认动画速度。b/130055522
API 变更
- 废弃了
NavHostFragment
的createFragmentNavigator()
方法,并且其功能已移至新的onCreateNavController()
方法,以便您更清楚地了解,这是创建子类NavHostFragment
时添加自定义导航器的正确入口点。b/122802849 - 将
hasDeepLink()
方法添加到了NavDestination
,以便检查给定的Uri
是否可由给定的目标处理,或者在有NavGraph
的情况下,否可由导航图表中的任何目标处理。b/117437718
bug 修复
- 默认参数现在将正确传递到
OnDestinationChangedListener
实例。b/130630686 NavHostFragment
现在使用OnBackPressedDispatcher
拦截系统返回事件,从而修复了返回到 Fragment 时在 Fragment 生命周期方法中进行条件导航时出现的问题。b/111598096- 对于 Safe Args,现在可以将未指定
app:argType
的android:defaultValue=”@null”
正确推断为string
参数。b/129629192
版本 2.1.0-alpha02
2019 年 4 月 3 日
发布了 androidx.navigation:*:2.1.0-alpha02
。点击此处可查看此版本中包含的提交内容。
新功能
- 您现在可以通过针对 Kotlin 用户的
by navGraphViewModels()
属性委托或者通过使用添加到NavController
的getViewModelStore()
API,创建在导航图表级别限定范围的 ViewModel。b/111614463
API 变更
- 您现在可以将
app:targetPackage
添加到<activity>
,以限制匹配的软件包名称。它支持app:targetPackage="${applicationId}"
,可将软件包限制为您自己的应用 ID。b/110975456
bug 修复
<activity>
目标的android:name
在膨胀时不再解析为类,从而避免在使用动态功能时出现 ClassNotFoundException。b/124538597
版本 2.1.0-alpha01
2019 年 3 月 19 日
这是 Navigation 2.1.0
的第一个 Alpha 版本。
依赖项变更
- Navigation 现在依赖于
androidx.core:core:1.0.1
和androidx.fragment:fragment:1.1.0-alpha05
。此版本还移除了androidx.legacy:legacy-support-core-utils:1.0.0
的依赖项。b/128632612
API 变更
- 新增了
Navigation.createNavigateOnClickListener(NavDirections)
方法,以替代使用资源 ID 和套装创建点击监听器的方法。b/127631752 - 已废弃
FragmentNavigator.instantiateFragment
,默认实现现在使用FragmentFactory
来实例化 Fragment。b/119054429
bug 修复
- 有附加到目标的参数时,Navigation 不再发送 null
Bundle
,从而修复了在使用android:defaultValue="@null"
时出现的问题。b/128531879 - Safe Args 现在依赖于 KotlinPoet 1.1.0,从而修复了软件包名称过长的问题。b/123654948
版本 2.0.0
版本 2.0.0
2019 年 3 月 14 日
发布了 Navigation 2.0.0
,该版本与 2.0.0-rc02
相比没有变化。
版本 2.0.0-rc02
2019 年 3 月 6 日
Navigation 2.0.0-rc02 提供了具有 androidx.navigation
组 ID 的新制品,并将其依赖项更改为 AndroidX 等效项。
2.0.0-rc02 的行为与 Navigation 1.0.0-rc02 的行为相同,除了更新依赖项以与新依赖项保持一致之外,从 1.0.0-rc02 更新不需要对代码做出任何更改。
项目必须已迁移到 AndroidX 才能使用 Navigation 的 2.X 版本。Navigation 1.0 稳定版将是最后一个使用支持库依赖项的版本;1.0 以后的所有未来开发都将基于 AndroidX,并以 2.0 稳定版为基础进行构建。
AndroidX 之前的依赖项
对于 AndroidX 之前的 Navigation 版本,请添加以下依赖项:
dependencies {
def nav_version = "1.0.0"
implementation "android.arch.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
implementation "android.arch.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
}
对于 Safe Args,在顶层 build.gradle
文件中添加以下类路径
buildscript {
repositories {
google()
}
dependencies {
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
}
}
版本 1.0.0
版本 1.0.0
2019 年 3 月 14 日
发布了 Navigation 1.0.0
,该版本与 1.0.0-rc02
相比没有变化。
版本 1.0.0-rc02
2019 年 2 月 26 日
这是 Navigation 1.0.0 稳定版的第二个候选版本。此版本修复了很多问题。
bug 修复
- 修复了在根图没有 ID 的情况下
popBackStack()
会被忽略的问题 b/126251695 - 在处理没有
FLAG_ACTIVITY_NEW_TASK
的深层链接后调用navigateUp()
时,它现在可以正确处理导航回应用的任务这一行为 b/126082008 - 修复了
ActivityNavigator.applyPopAnimationsToPendingTransition
无法应用正确的弹出退出动画的问题 b/126237567 - 由 Safe Args 生成的 Kotlin 代码现在可以正确转义 Kotlin 关键字,例如与
R
类相关联的软件包名称中的in
和fun
。b/126020455
版本 1.0.0-rc01
2019 年 2 月 21 日
这是 Navigation 1.0.0 稳定版的候选版本。此版本修复了一个问题。
bug 修复
- 修复了使用 Fragment 和
singleTop
导航操作时出现的问题 b/124294805
版本 1.0.0-beta02
2019 年 2 月 12 日
此版本进行了一些微小的改进并修复了一些重要 bug。
新功能
- 您现在可以将
0
用作reference
参数的android:defaultValue
。b/124248602
行为变更
- 深层链接完全匹配现在优先于使用
.*
或具有匹配参数的深层链接匹配。b/123969518
bug 修复
- 当返回堆栈上弹出最后一个目标时,
popBackStack()
和navigateUp
现在可以正确地返回false
,从而修复了1.0.0-beta01
中出现的回归问题。b/123933201 - Navigation 现在可以在恢复保存的实例状态期间正确设置
ClassLoader
,从而避免在Navigator
保存的状态或发送给NavDestination
的参数中使用自定义类时出现问题。b/123893858 - 从保存的实例状态恢复
Parcelable[]
参数时,Safe Args 生成的 NavArgs 类不再崩溃。b/123963545 - Safe Args 现在可以正确清理不必要生成的 Kotlin 类。b/124120883
版本 1.0.0-beta01
2019 年 2 月 4 日
这是 Navigation 的第一个测试版;今后,Navigation API 会在推出下一个版本之前一直保持稳定(除非出现严重问题)。此版本修复了一些问题并更改了一些行为。
行为变更
- Navigation 现在可以确保参数默认值在运行时以及通过 Safe Args 得到相同的处理。因此,仅
app:argType="reference"
的参数可具有指向其他资源的默认值(例如@color/colorPrimary
)。解析 Navigation XML 时,尝试使用app:argType
不同的引用默认值会导致出现异常。b/123551990 - Safe Args 现在依赖于 Android Gradle 插件3.3.0 aosp/888413
- Safe Args 现在依赖于 Kotlin 1.3.20 aosp/888414
bug 修复
- 现在,可以在所有版本的 Android Gradle 插件的库和功能模块中使用 Safe Args。b/121304903
- 修复了导致单个
popBackStack()
操作在返回堆栈顶部弹出目标的所有副本,而不是一次仅弹出一个目标的回归问题。b/123552990 - 修复了
FragmentNavigator
状态与NavController
状态不同步,从而在尝试恢复返回堆栈时导致出现IllegalStateException
的问题。b/123803044 - 修复了将 ProGuard 与 obfuscation 一起使用时,
NavigationUI
处理的返回箭头不会显示的问题。b/123449431 - 由 Safe Args 生成的代码现在可以正确处理使用指向静态内部类的
app:argType
这一行为,静态内部类的格式为.OuterClass$InnerClass
。b/123736741 - 由 Safe Args 生成的 Java 代码现在可以正确处理全局操作和深层嵌套的目标。b/123347762
版本 1.0.0-alpha11
2019 年 1 月 23 日
这是 1.0.0-alpha10
的修补程序版本,修复了 Safe Args 的问题。
bug 修复
- 修复了 Safe Args 无法导入与全局操作相关联的 Directions 类的问题。b/123307342
版本 1.0.0-alpha10
2019 年 1 月 23 日
已知问题
- Safe Args 无法导入与全局操作相关联的 Directions 类。b/123307342
此版本包含重大 API 变更;请参阅下面的“重大变更”部分。
新功能
- Kotlin 用户现在可以使用
by navArgs()
属性委托来延迟获取对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
bug 修复
NavDeepLinkBuilder
现在可以使用您传入的参数来确定唯一性,从而正确地将多个同时PendingIntent
处理到同一目标。b/120042732- 将嵌套的
NavHostFragment
或其他子 Fragment 与返回堆栈一起使用时,NavController
现在可以正确处理popBackStack()
操作。b/122770335 NavigationUI
现在可以正确设置向上按钮的内容描述。b/120395362- Safe Args 生成的 Directions 类现在可以正确处理与目标上的操作具有相同 ID 的全局操作。b/122962504
- 当
equals()
返回 true 时,Safe Args 生成的NavDirections
类现在可以相应地具有相等的hashCode()
值。b/123043662 - 如果尝试对
NavHostFragment
的FragmentManager
自定义FragmentTransactions
,那么FragmentNavigator
现在会发出一条更明确的错误消息。应该始终使用getChildFragmentManager()
。b/112927148
版本 1.0.0-alpha09
2018 年 12 月 18 日
此版本包含重大 API 变更;请参阅下面的“重大变更”部分。
我们已选择不继续开发 android.arch.navigation:navigation-testing
制品。虽然经证实该制品对 NavController
的内部测试有帮助,但我们仍强烈建议使用其他测试策略,例如模拟 NavController
实例以验证是否已完成正确的 navigate()
调用。2018 年 Android 开发者峰会的 Single Activity 讲座对此方法做出了详细讨论,我们也将专门针对使用 Navigation 进行测试撰写其他文档。
新功能
- 与
NavigationUI
方法一起使用时,menuCategory="secondary"
的MenuItem
将不再弹出返回堆栈。b/120104424 AppBarConfiguration
现在允许您设置后备OnNavigateUpListener
实例,当navController.navigateUp()
返回false
时,系统会调用此实例。b/79993862 b/120690961
重大变更
- 将
<argument>
与argType="reference"
一起使用时,Navigation 将不再解析引用,而是提供原始资源 ID。b/111736515 onNavDestinationSelected()
现在默认弹回到导航图表的起始目标,使其与setup
方法保持一致。您可以将menuCategory="secondary"
添加到MenuItem
来避免弹出返回堆栈。aosp/852869- 生成的
Args
类的fromBundle()
方法现在接受非 nullBundle
,而不是可为 null 的Bundle
aosp/845616
bug 修复
- 参数现在可以从深层链接中正确解析为正确的
argType
,而非始终解析为字符串 b/110273284 - Navigation 现在可以正确导出其公开资源 b/121059552
- Safe Args 现在可与 Android Gradle 插件 3.4 Canary 4 版及更高版本兼容 b/119662045
版本 1.0.0-alpha08
2018 年 12 月 6 日
此版本包含重大 API 变更;请参阅下面的“重大变更”部分。
新功能
- 当目标标签与
NavigationUI
方法一起使用时,系统现在会自动将android:label
中的{argName}
实例替换为正确的参数 b/80267266 - Navigation 现在依赖于支持库 28.0.0 b/120293333
重大变更
OnNavigatedListener
已重命名为OnDestinationChangedListener
b/118670572OnDestinationChangedListener
现在也传递参数的Bundle
aosp/837142- 移除了
app:clearTask
和app:launchDocument
属性及其关联的方法。使用app:popUpTo
与图表的根目录从返回堆栈中移除所有目标。b/119628354 ActivityNavigator.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 - 将 Fragment 创建工作移到了
FragmentNavigator
,从而可以更轻松地将 Fragment 创建工作委托给FragmentFactory
。b/119054429 NavGraphNavigator
的构造函数不再接受Context
aosp/835340- NavigatorProvider 现在是一个类,而不是一个接口。由
getNavigatorProvider()
返回的NavigatorProvider
没有改变其功能。aosp/830660 - 移除了
NavDestination.navigate()
。改为在Navigator
上调用navigate()
。aosp/830663 - 对
Navigator
进行了重大重构,不再需要OnNavigatorNavigatedListener
,而是让navigate
返回已导航到的NavDestination
。 Navigator
实例无法再向NavController
发送弹出事件。考虑使用OnBackPressedCallback
来拦截按下返回按钮的操作并调用navController.popBackStack()
。aosp/833716
bug 修复
- 当目标是
<navigation>
元素时,popUpTo
现在可以一致地工作 b/116831650 - 修复了在使用嵌套图表时导致出现
IllegalArgumentException
的一些错误 b/118713731 b/113611083 b/113346925 b/113305559 <activity>
目标的dataPattern
属性现在将通过调用toString()
来填充非字符串参数中的参数 b/120161365
Safe Args
- Safe Args 支持可序列化对象,包括枚举值。枚举类型可以使用不带类名的枚举文字来设置默认值(例如
app:defaultValue="READ"
)b/111316353 - Safe Args 支持所有受支持类型的数组 b/111487504
- Safe Args 现在会忽略资源目录的子文件夹 b/117893516
- Safe Args 会视情况添加
@Override
注释 b/117145301
版本 1.0.0-alpha07
2018 年 10 月 29 日
新功能
- 通过新的 AppBarConfiguration 类,您可以自定义将哪些目标视为顶级目标。如需了解详情,请参阅更新的文档。b/117333663
- 您现在可以将参数传递给图表的起始目标 b/110300470
- 深层链接现在支持带有句点、连字符和加号的自定义架构。b/112806402
重大变更
- 将
navigation-testing-ktx
模块放入了navigation-testing artifact
,该模块将不再发布。 navigation-testing
制品现在依赖于 Kotlin 标准库。API 已被更改以与 Kotlin 惯例更加一致,但您可以继续将其用于采用 Java 语言编写的测试。- 不再支持元数据清单注册的导航图表。b/118355937
- 操作不能再附加到 <activity> 目标。aosp/785539
bug 修复
- 深层链接现在可以正确解析查询参数。b/110057514
- Activity 目标现在可以正确应用所有进场动画和退出动画。b/117145284
- 修复了使用自定义导航器时在配置更改后发生崩溃的问题。b/110763345
Safe Args
- Safe args 现在固定依赖于 Android Gradle 插件 3.2.1。b/113167627
- 现在可以为内部类生成方向。b/117407555
- 修复了与生成 <include> 图表的方向有关的问题。b/116542123
版本 1.0.0-alpha06
2018 年 9 月 20 日
新功能
- 现在支持 Fragment 和 Activity 目标的共享元素转换 b/79665225。如需了解详情,请参阅使用导航架构组件实现导航。
- 如果在
NavigationView
中选择某项内容,现在将关闭任何包含的底部工作表 b/112158843
API 变更
- 重大变更:导航器
navigate()
方法现在接受Navigator.Extras
参数。 - NavController 的
getGraph()
方法现在为NonNull
b/112243286
bug 修复
- 与来自各个目标的视图一起使用时,
NavigationUI.setupWithNavController()
不再泄露视图 b/111961977 - 现在仅调用一次导航器
onSaveState()
b/112627079
Safe Args
- 导航目标 Directions 类现在会扩展其父级的 Directions 类(如果存在)b/79871405
- Directions 和 Args 类现在具有实用的
toString()
实现 b/111843389
版本 1.0.0-alpha05
2018 年 8 月 10 日
bug 修复
- 修复了导致返回堆栈行为不正确的 bug。b/111907708
- 修复了生成的 Args 类的
equals()
中的 bug。b/111450897 - 修复了 Safe Args 中的构建错误。b/109409713
- 修复了从资源标识符到 java 名称的转换问题。b/111602491
- 修复了 Safe Args 插件中有关为空性的错误消息。
- 添加了缺少的可为 null 性注解。
版本 1.0.0-alpha04
2018 年 7 月 19 日
Navigation 1.0.0-alpha04
和关联的 Safe Args Gradle 插件包含多项 API 变更、行为变更和 bug 修复。
API/行为变更
- NavHostFragment 会始终将当前的 Fragment 设置为主要导航 Fragment,从而确保在弹出外部 NavController 之前弹出子 Fragment 管理器 b/111345778
Safe Args
- 重大变更:将
app:type
更改为app:argType
,以避免与其他库(如 ConstraintLayout 2.0.0-alpha1)发生冲突 b/111110548 - 来自 Safe Args 的错误消息现在可供点击 b/111534438
- Args 类现在确认
NonNull
属性实际上不是 null b/111451769 - 向 NavDirections 和 Args 生成的类添加了额外的
NonNull
注释 b/111455455 b/111455456
bug 修复
- 修复了深层链接到 fragment 目标后系统返回按钮的问题 b/111515685
版本 1.0.0-alpha03
2018 年 7 月 12 日
Navigation 1.0.0-alpha03
和关联的 Safe Args Gradle 插件包含多项 API 变更、行为变更和 bug 修复。
API/行为变更
- 为工具栏添加了 NavigationUI.setupWithNavController 方法 b/109868820
- 为 CollapsingToolbarLayout 添加了 NavigationUI.setupWithNavController 方法 b/110887183
- 当返回堆栈为空或给定的目标 ID 不在返回堆栈中时,popBackStack() 现在返回 false b/110893637
- FragmentNavigator 现在会在 FragmentManager 保存状态后忽略导航操作,从而避免出现“在 onSaveInstanceState 后无法执行此操作”异常 b/110987825
Safe Args
- 重大变更:操作和参数名称中的非字母数字字符将替换为各自 NavDirections 方法名称中的驼峰式大小写格式
- 例如,
DemoController.index
将变为setDemoControllerIndex
b/79995048 - 例如,
action_show_settings
将变为actionShowSettings
b/79642240
- 例如,
- 重大变更:默认情况下,现在将参数视为非 null。要允许字符串和 Parcelable 参数具有 null 值,请添加
app:nullable="true"
b/79642307 - 您现在可以采用“123L”的形式对默认值使用
app:type="long"
b/79563966 - 现在支持 Parcelable 参数,并使用
app:type
的完全限定类名。支持的唯一一个默认值是"@null"
b/79563966 - Args 类现在可实现
equals()
和hashCode()
b/79642246 - Safe Args 插件现在可以应用于库项目 b/80036553
- Safe Args 插件现在可以应用于功能项目 b/110011752
bug 修复
- 修复了在 Fragment 生命周期方法期间导航时出现的问题 b/109916080
- 修复了在多次导航嵌套图表时出现的问题 b/110178671
- 修复了在将
setPopUpTo
与图表中的第一个目标一起使用时出现的问题 b/109909461 - 修复了将所有
app:defaultValue
值作为字符串传递的问题 b/110710788 - 与 Android Gradle 插件 3.2 Beta 01 捆绑在一起的 aapt2 现在为 Navigation XML 文件中的每个
android:name
属性添加了保留规则 b/79874119 - 修复了在更换默认 FragmentNavigator 时出现的内存泄露问题 b/110900142
版本 1.0.0-alpha02
2018 年 6 月 7 日
行为变更
FragmentNavigator
现在使用setReorderingAllowed(true)
。b/109826220Navigation 现在对从深层链接网址解析的参数执行 URLDecode 操作。b/79982454
bug 修复
修复了在从 Fragment 生命周期方法调用 Navigation 时出现的
IllegalStateException
。b/79632233Navigation 现在依赖于支持库 27.1.1 来修复使用动画时的闪烁问题。b/80160903
修复了在使用 defaultNavHost="true" 作为子 fragment 时出现的
IllegalArgumentException
。b/79656847修复了在使用 NavDeepLinkBuilder 时出现的
StackOverflowError
。b/109653065修复了在导航回嵌套图表时出现的
IllegalArgumentException
。b/80453447修复了在使用
launchSingleTop
时 Fragment 重叠的问题。b/79407969Navigation 现在可以为嵌套图表构建正确的合成返回堆栈。b/79734195
使用嵌套图表作为
MenuItem
时,NavigationUI 现在会突出显示正确的项。b/109675998
API 变更
废弃了操作的
clearTask
属性以及NavOptions
中的关联 API。b/80338878废弃了操作的
launchDocument
属性以及NavOptions
中的关联 API。b/109806636
版本 1.0.0-alpha01
2018 年 5 月 8 日
Navigation 可以提供用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01
。