网站建设原创文章 关键词西安短视频培训
1. Navigation 介绍
Navigation 组件 是 Android Jetpack 的一部分,用于简化应用内导航逻辑,支持 Fragment、Activity 和 Compose 之间的跳转。核心优势:
- 单 Activity 架构:减少 Activity 冗余,通过 Fragment 或 Compose 实现界面切换。
- 可视化导航图:通过 XML 或代码声明页面跳转关系。
- 统一返回栈管理:自动处理返回按钮和手势导航。
- 类型安全的参数传递:通过 Safe Args 插件或 Compose 的 Route 实现。
2. 项目中导入 Navigation 插件
传统 View 项目 (XML + Fragment)
在 build.gradle (Module)
中添加依赖:
dependencies {def nav_version = "2.7.7"implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"implementation "androidx.navigation:navigation-ui-ktx:$nav_version"// Safe Args 插件(可选)classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}
Compose 项目
在 build.gradle (Module)
中添加:
dependencies {def nav_version = "2.7.7"implementation "androidx.navigation:navigation-compose:$nav_version"
}
在导入时要尤其注意导入的是 navigation-fragment 还是 navigation-compose 两者的使用有很大区别
3. 实现 Navigation 导航(XML + Fragment)
步骤 1:创建导航图
在 res/navigation
目录下新建 nav_graph.xml
:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/nav_graph"app:startDestination="@id/homeFragment"><fragmentandroid:id="@+id/homeFragment"android:name="com.example.HomeFragment"android:label="Home"><actionandroid:id="@+id/action_to_detail"app:destination="@id/detailFragment" /></fragment><fragmentandroid:id="@+id/detailFragment"android:name="com.example.DetailFragment"android:label="Detail" />
</navigation>
其中的action属于显式定义动作,如果是跳转页面的话可以不显式定义,但如果使用androidx.navigation:safe-args插件必须定义动作才能生成参数类。
步骤 2:配置 NavHost
在 Activity 的布局中添加 NavHostFragment
:
<androidx.fragment.app.FragmentContainerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/nav_host_fragment"android:name="androidx.navigation.fragment.NavHostFragment"app:navGraph="@navigation/nav_graph"app:defaultNavHost="true" />
步骤 3:执行导航操作
在 Fragment 中通过 NavController
跳转:
// HomeFragment.kt
button.setOnClickListener {findNavController().navigate(R.id.action_to_detail)
}
参数传递(Safe Args)
- 在
nav_graph.xml
中定义参数:
<fragment android:id="@+id/detailFragment"><argumentandroid:name="userId"app:argType="string" />
</fragment>
- 通过 Safe Args 传递参数:
val action = HomeFragmentDirections.actionToDetail("user123")
findNavController().navigate(action)
4. 基于 Compose 的 Navigation 导航
步骤 1:定义路由
在 Compose 中通过字符串定义路由:
object Routes {const val HOME = "home"const val DETAIL = "detail/{userId}"
}
步骤 2:配置 NavController
在 MainActivity
中初始化导航控制器:
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Routes.HOME) {composable(Routes.HOME) {HomeScreen(onNavigateToDetail = { userId ->navController.navigate("detail/$userId")})}composable(Routes.DETAIL) { backStackEntry ->val userId = backStackEntry.arguments?.getString("userId")DetailScreen(userId = userId)}
}
步骤 3:触发导航
在 HomeScreen
中点击按钮跳转:
Button(onClick = { onNavigateToDetail("user123") }) {Text("Go to Detail")
}
5. 总结
- 传统 XML 方式:适合已有 Fragment 项目,通过可视化导航图管理跳转逻辑。
- Compose 方式:声明式 API,更适合现代化 Compose 项目,路由管理更灵活。
- 核心优点:统一导航逻辑、类型安全、简化返回栈管理。
推荐场景:
- 新项目优先使用 Compose Navigation。
- 旧项目逐步迁移时,可混合使用 XML 和 Compose 导航。