Android Jetpack 组件库 ->Jetpack Navigation
Jetpack Navigation 是 Android Jetpack 组件库中用于简化应用内页面导航的核心工具,特别推荐用于 "单 Activity + 多 Fragment" 架构模式。以下是其核心概念、使用方法和优势的详细解析:
一、核心概念
-
导航图 (NavGraph)
-
XML 资源文件:集中定义所有页面(目的地)及其跳转关系(Action),可视化展示导航流程。
-
起始目的地:通过
app:startDestination
指定首个显示的页面。
-
-
导航宿主 (NavHostFragment)
-
容器作用:承载导航图中的 Fragment,实际布局中通过
FragmentContainerView
实现。 -
关键属性:
-
android:name="androidx.navigation.fragment.NavHostFragment"
-
app:navGraph="@navigation/nav_graph"
-
app:defaultNavHost="true"
(拦截返回键)。
-
-
-
导航控制器 (NavController)
-
管理跳转逻辑:通过
navigate()
执行跳转,navigateUp()
返回上一级。 -
获取方式:
// 在 Fragment 中 findNavController().navigate(R.id.action_to_target) // 在 View 或 Activity 中 Navigation.findNavController(view).navigate(R.id.action_id)
-
二、基本使用流程
1. 环境配置
-
依赖添加(
build.gradle
):dependencies {implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"implementation "androidx.navigation:navigation-ui-ktx:2.5.3"// Safe Args 支持类型安全传参classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3" } apply plugin: "androidx.navigation.safeargs.kotlin"
2. 创建导航图
-
在
res/navigation/
下新建nav_graph.xml
,添加 Fragment 目的地并关联 Action。<navigation xmlns:android="http://schemas.android.com/apk/res/android"app:startDestination="@id/homeFragment"><fragment android:id="@+id/homeFragment" ... /><fragment android:id="@+id/detailFragment" ... /><action android:id="@+id/action_home_to_detail"app:destination="@id/detailFragment"app:enterAnim="@anim/slide_in_right" /> </navigation>
3. 布局中嵌入 NavHost
-
Activity 布局示例:
<androidx.fragment.app.FragmentContainerViewandroid:id="@+id/nav_host"android:name="androidx.navigation.fragment.NavHostFragment"app:navGraph="@navigation/nav_graph"app:defaultNavHost="true" />
4. 执行跳转与传参
-
普通跳转:
view.findViewById<Button>(R.id.btn).setOnClickListener {findNavController().navigate(R.id.action_home_to_detail) }
-
Safe Args 传参(类型安全):
-
导航图中定义参数:
<argument android:name="key" app:argType="string" />
-
发送方:
val direction = HomeFragmentDirections.actionHomeToDetail("value") findNavController().navigate(direction)
-
接收方:
val args: DetailFragmentArgs by navArgs() val value = args.key
-
三、高级功能
-
转场动画
-
XML 配置:在 Action 标签中设置
enterAnim
、exitAnim
等属性。 -
动态配置:
val options = navOptions { anim { enter = R.anim.fade_in } } findNavController().navigate(R.id.action_id, null, options)
-
-
深层链接 (Deep Link)
-
导航图中配置:
<deepLink android:uri="app://detail/{id}" />
-
通过
PendingIntent
或 URL 直接跳转到指定 Fragment。
-
-
与 UI 组件集成
-
底部导航栏/抽屉菜单:通过
NavigationUI
绑定:val navController = findNavController(R.id.nav_host) val bottomNav = findViewById<BottomNavigationView>(R.id.bottom_nav) NavigationUI.setupWithNavController(bottomNav, navController)
-
四、与传统 Activity 跳转的对比
特性 | Navigation | 传统 Activity 跳转 | |
---|---|---|---|
路由管理 | 集中式 (XML 导航图) | 分散在代码中 | |
参数传递 | 类型安全 (Safe Args) | Bundle 手动传递,易出错 | |
返回栈管理 | 自动处理 | 需手动处理 onBackPressed() | |
Deep Link 支持 | 原生集成 | 需自定义 Intent 过滤 | |
可视化工具 | Android Studio 导航编辑器 | 无 |
五、常见问题解答
-
如何迁移现有项目?
逐步替换:保留 Activity 作为容器,将内部页面转为 Fragment,通过导航图管理跳转16。 -
如何处理返回结果?
使用FragmentResult API
替代startActivityForResult()
。 -
Activity 能否作为目的地?
可以,但 Navigation 主要优化 Fragment 跳转,Activity 跳转建议用startActivity()
。
总结
Jetpack Navigation 通过声明式导航图、类型安全传参和深度 UI 集成,显著简化了复杂导航逻辑的开发,尤其适合单 Activity 架构。其可视化工具和标准化 API 降低了维护成本,是构建现代 Android 应用的首选导航方案。
更多实践案例可参考:Jetpack Navigation 官方文档。