ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android Jetpack Navigation Components 导航组件实战指南:Navigation Graph、NavHost 与 NavController 全面解析

Android Jetpack Navigation Components 导航组件实战指南:Navigation Graph、NavHost 与 NavController 全面解析 文档教程知识库【免费下载链接】developer-roadmapInteractive roadmaps, guides and other educational content to help developers grow in their careers.项目地址https://gitcode.com/GitHub_Trending/de/developer-roadmap点击查看免费下载本文以 developer-roadmap 仓库中 Android 学习路径的 Navigation Components 专题为核心系统讲解 Jetpack Navigation 导航组件的三大核心构成——导航图Navigation Graph、导航宿主NavHost与导航控制器NavController并结合仓库内 NavHost、Tasks Backstack、Intent 等相邻知识点从依赖配置、XML 编写到 Compose 声明式导航给出可直接落地的导航方案。读完本文你将掌握如何用 Navigation 组件统一管理 Fragment 与 Compose 界面的跳转、正确处理 Up/Back 返回行为、实现 Deep Link 深层链接并理解其与任务栈Task Back Stack的内在关系。一、什么是 Navigation Components**Navigation Components导航组件**是 Android Jetpack 的一部分其设计目标是从根本上简化 Android 应用中的导航实现。在引入它之前开发者往往需要手工管理 Fragment 事务、自行处理返回键逻辑、在 Activity 之间传递 Intent代码既分散又容易出错。Navigation 组件把这些分散的样板代码收敛为一套声明式的、可视化可调试的导航体系帮助开发者遵循最佳实践并自动完成许多重复性工作。在 Android 学习路线中导航能力与 Fragments可复用的 UI 片段、Jetpack Compose声明式 UI 工具包深度耦合无论你使用传统 View Fragment 体系还是全面转向 ComposeNavigation 组件都提供了对应的导航宿主与导航图支持。为什么需要一套组件化的导航方案一致的导航体验无论是深层次导航deep navigation还是条件导航conditional navigation如登录判断后分流Navigation 组件都能保证用户体验的一致性与可预测性。自动处理返回逻辑组件自动处理 Up应用栏返回与 Back系统返回行为并且在不同设备形态手机、平板、可折叠设备上行为一致。Deep Link 深度链接内置深度链接支持可以把导航目标直接绑定到 URL 或 intent实现从通知、网页、桌面快捷方式直达指定页面。减少样板代码不再需要手写FragmentTransaction、add/replace/remove等繁琐调用导航意图通过NavController.navigate()表达路由由导航图集中定义。二、三大核心构成Navigation 组件由三个关键部分构成三者各司其职、协同工作组成部分职责形态Navigation Graph导航图集中描述应用中所有可导航的目的地destination以及它们之间的跳转关系actionXML 资源文件或 Compose 中的 DSLNavHost导航宿主导航图的目的地实际渲染与挂载的容器是界面切换发生的舞台传统体系下为NavHostFragmentCompose 下为NavHostcomposableNavController导航控制器在 NavHost 内执行导航动作、管理返回栈的对象运行时对象持有导航图与当前状态从源码结构看三者是典型的声明Graph— 容器Host— 执行Controller分层Graph 定义能去哪Host 决定在哪展示Controller 负责怎么过去、怎么回来。2.1 Navigation Graph导航图导航图是 XML 资源文件通常位于res/navigation/目录下根节点为navigation。它把应用的每个页面抽象为目的地destination并用action定义目的地之间的转移关系。一个典型的导航图示例?xml version1.0 encodingutf-8? navigation xmlns:androidhttp://schemas.android.com/apk/res/android xmlns:apphttp://schemas.android.com/apk/res-auto android:idid/nav_graph app:startDestinationid/homeFragment !-- 首页目的地 -- fragment android:idid/homeFragment android:namecom.example.app.HomeFragment android:label首页 !-- 定义从首页跳转到详情页的动作 -- action android:idid/action_home_to_detail app:destinationid/detailFragment app:enterAnimanim/nav_default_enter_anim app:exitAnimanim/nav_default_exit_anim app:popEnterAnimanim/nav_default_pop_enter_anim app:popExitAnimanim/nav_default_pop_exit_anim / /fragment !-- 详情页目的地并声明深层链接 -- fragment android:idid/detailFragment android:namecom.example.app.DetailFragment android:label详情 deepLink app:urihttps://example.com/detail/{id} / argument android:nameid app:argTypeinteger android:defaultValue0 / /fragment /navigation要点说明app:startDestination导航图的入口目的地即应用首次打开时 NavHost 展示的第一个页面。action定义从当前目的地到目标目的地的跳转可配置转场动画在代码中通过NavController.navigate(R.id.action_home_to_detail)触发。argument声明目的地接收的参数类型、默认值配合 Safe Args 插件可生成类型安全的参数访问类。deepLink声明该目的地可通过指定 URI 直达系统会将匹配的 URL 解析为对应的导航动作。2.2 NavHost导航宿主根据仓库中的 NavHost 专题文档NavHost 是一个特殊的 Android UI 组件通常是 Fragment在应用内充当不同目的地之间切换的枢纽——它像舞台一样承载并展示应用的不同界面。NavHost 与 NavController 协同工作NavController 基于导航图驱动界面切换NavHost 负责把切换结果渲染出来。传统 View 体系下使用NavHostFragment!-- activity_main.xml -- androidx.fragment.app.FragmentContainerView android:idid/nav_host_fragment android:nameandroidx.navigation.fragment.NavHostFragment android:layout_widthmatch_parent android:layout_heightmatch_parent app:defaultNavHosttrue app:navGraphnavigation/nav_graph /app:defaultNavHosttrue让 NavHostFragment 拦截系统返回键并交给 NavController 处理这是自动处理 Back的关键开关。app:navGraph绑定导航图资源NavController 将据此加载目的地与跳转关系。Jetpack Compose体系下使用NavHostcomposableCompose 版导航在 NavHost 文档 中有官方资料指引Composable fun AppNavHost() { val navController rememberNavController() NavHost( navController navController, startDestination home ) { composable(home) { HomeScreen(onNavigateToDetail { navController.navigate(detail/42) }) } composable( route detail/{id}, arguments listOf(navArgument(id) { type NavType.IntType }) ) { backStackEntry - val id backStackEntry.arguments?.getInt(id) ?: 0 DetailScreen(id) } } }Compose 版导航把路由route、参数arguments和页面 composable 绑定在一起导航意图完全用字符串路由表达无需 XML。2.3 NavController导航控制器NavController 是导航的执行引擎负责在 NavHost 中管理导航状态与返回栈。获取方式Fragment 体系Fragment.findNavController()或Activity中通过Navigation.findNavController(activity, R.id.nav_host_fragment)。Compose 体系rememberNavController()返回。常用 API// 按 action 导航导航图中定义的跳转关系 navController.navigate(R.id.action_home_to_detail) // 按目的地 id 导航 navController.navigate(R.id.detailFragment) // 带参数导航配合 Bundle val bundle bundleOf(id to 42) navController.navigate(R.id.detailFragment, bundle) // 返回上一页等价于系统返回键行为 navController.navigateUp() // 弹栈到指定目的地条件导航常用 navController.popBackStack(R.id.homeFragment, inclusive false)关键行为语义navigate()会维护一个返回栈新目的地入栈按 Back 时逐级出栈。navigateUp()与系统 Back 的区别在于它优先处理导航图中的层级关系如从详情页 Up 到其父级语义更贴近应用内层级导航而系统返回键在defaultNavHosttrue时由 NavController 统一接管。popBackStack(destinationId, inclusive)用于实现条件导航后的栈清理例如登录页成功后的不可返回登录页需求。三、Navigation 组件带来的核心能力3.1 统一的 Up/Back 行为与返回栈管理Android 的返回机制建立在任务Task与返回栈Back Stack之上。根据仓库中的 Tasks Backstack 专题任务Task是用户为完成某个目标而交互的一组 Activity 的集合返回栈则记录了这些 Activity 被打开的顺序用户按 Back 时Activity 按相反顺序出栈。理解 Task 与 Back Stack 的行为是构建可预测导航流程的前提。Navigation 组件将这一模型内化NavController 内部维护自己的返回栈navigate()即入栈、Back 即出栈并在多设备形态下保持一致。它还提供了NavOptions精细控制栈行为val options navOptions { popUpTo(R.id.homeFragment) { inclusive false } // 弹栈到首页但不包含首页 launchSingleTop true // 栈顶已存在目标则复用 } navController.navigate(R.id.detailFragment, null, options)这种声明式栈管理极大降低了手动维护 Fragment 栈的心智负担。3.2 Deep Link 深度链接Deep Link 让应用内的任意目的地可以被外部入口通知、网页 URL、快捷方式直接打开。Navigation 组件在导航图中用deepLink声明deepLink app:urihttps://example.com/detail/{id} / deepLink app:uriexample://detail/{id} /第一种是https 链接需要在AndroidManifest.xml中对承载导航的 Activity 声明 intent-filter 以接收链接。第二种是自定义 scheme如example://同样需要 intent-filter 支持。从机制上讲Deep Link 与 Intent 体系一脉相承Intent 是 Android 组件间晚绑定的软件机制本质是持有操作抽象描述的被动数据结构。点击一个 https 链接时系统将其包装为 Implicit Intent与各应用在AndroidManifest.xml中声明的 Intent Filters描述组件能接收的动作、数据类型与类别进行匹配找到能处理的 Activity。Navigation 组件把这一过程进一步收敛intent 匹配到宿主 Activity 后NavController 依据导航图中的deepLink声明解析出目标目的地与参数如{id}占位符自动完成跳转。Manifest 中的配套声明activity android:name.MainActivity intent-filter action android:nameandroid.intent.action.VIEW / category android:nameandroid.intent.category.DEFAULT / category android:nameandroid.intent.category.BROWSABLE / !-- 支持 https 深链 -- data android:schemehttps android:hostexample.com / !-- 支持自定义 scheme 深链 -- data android:schemeexample / /intent-filter /activity值得补充的是应用内部的常规跳转则通常使用 Explicit Intent——显式指定目标组件如setClass(Context, Class)不经过系统解析适合应用内启动 Activity、广播与 Service这与 Navigation 组件内部基于导航图的跳转在概念上是互补的Navigation 处理应用内界面流Intent 处理组件级/跨应用通信。3.3 条件导航与一致体验条件导航指根据运行期状态决定跳转去向典型场景是未登录跳登录页已登录进主页。配合导航图与NavOptions可以优雅地实现并保持返回栈正确if (isLoggedIn) { navController.navigate(R.id.mainFragment) { popUpTo(R.id.loginFragment) { inclusive true } // 登录页出栈返回时不会回到登录页 } } else { navController.navigate(R.id.loginFragment) }四、依赖配置与接入步骤在build.gradle模块级中声明依赖dependencies { // 传统 View Fragment 体系 implementation(androidx.navigation:navigation-fragment-ktx:2.7.7) implementation(androidx.navigation:navigation-ui-ktx:2.7.7) // Jetpack Compose 体系 implementation(androidx.navigation:navigation-compose:2.7.7) }接入五步走建导航图res/navigation/nav_graph.xml定义 startDestination、目的地与 action。加 NavHost在布局中用FragmentContainerViewView 体系或NavHostcomposableCompose承载。绑定导航图View 体系通过app:navGraphnavigation/nav_graphCompose 通过NavHost(startDestination ...)。获取 NavControllerView 体系用findNavController()Compose 用rememberNavController()。执行导航调用navigate()并用NavOptions控制栈行为。依赖版本请以你所使用的 AndroidX 发布版本为准接入时按官方迁移指南核对。五、最佳实践小结始终通过导航图表达界面关系页面流向集中声明便于团队评审与可视化调试Android Studio 提供 Navigation Editor。把返回行为交给组件开启defaultNavHost不要在 Fragment 中手写onBackPressed逻辑与导航逻辑纠缠。参数化与类型安全目的地参数通过argument声明配合 Safe Args 生成类型安全的导航调用避免手写 Bundle 键值出错。善用条件导航 popUpTo登录、权限等条件分支务必同步清理返回栈避免用户按 Back 回到不应出现的页面。Deep Link 与 Intent 协同理解 显式/隐式 Intent 与 intent-filter 的匹配机制才能正确配置深链的 Manifest 声明。六、延伸学习路径在 developer-roadmap 仓库的 Android 学习路径中以下相邻主题与本文内容直接相关建议按序学习NavHost导航宿主详解Tasks Backstack任务与返回栈Fragments可复用 UI 片段Jetpack Compose声明式 UI 工具包Intent 与显式/隐式意图、Intent FiltersExplicit Intents 与 Implicit Intents掌握了 Navigation Graph、NavHost、NavController 三者协作模型再结合返回栈与 Intent 机制你就能在 Fragment 与 Compose 两种 UI 体系下构建出导航一致、深链可达、返回行为可预测的 Android 应用。赞分享文档教程知识库【免费下载链接】developer-roadmapInteractive roadmaps, guides and other educational content to help developers grow in their careers.项目地址https://gitcode.com/GitHub_Trending/de/developer-roadmap点击查看免费下载相关推荐Android Interface 与 Navigation 完整指南从 XML/Material Design 界面到 Jetpack 导航组件Android Interface 与 Navigation 完整指南从 XML/Material Design 界面到 Jetpack 导航组件 导读 本文文档教程知识库AppIntro与Jetpack Navigation集成引导页导航架构AppIntro与Jetpack Navigation集成引导页导航架构 你是否还在为Android应用的引导页与主应用导航衔接不畅而烦恼用户首次打开应用时移动开发UI组件三步轻松获取智慧教育平台电子课本tchMaterial-parser让教育资源触手可及三步轻松获取智慧教育平台电子课本tchMaterial parser让教育资源触手可及 你是否曾为无法下载智慧教育平台的电子课本而烦恼备课需要本地教材进行批网页爬虫教育创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表