当前位置: 首页 > news >正文

Android Jetpack 组件库 ->Jetpack Navigation

Jetpack Navigation 是 Android Jetpack 组件库中用于简化应用内页面导航的核心工具,特别推荐用于 "单 Activity + 多 Fragment" 架构模式。以下是其核心概念、使用方法和优势的详细解析:


一、核心概念

  1. 导航图 (NavGraph)

    • XML 资源文件:集中定义所有页面(目的地)及其跳转关系(Action),可视化展示导航流程。

    • 起始目的地:通过 app:startDestination 指定首个显示的页面。

  2. 导航宿主 (NavHostFragment)

    • 容器作用:承载导航图中的 Fragment,实际布局中通过 FragmentContainerView 实现。

    • 关键属性

      • android:name="androidx.navigation.fragment.NavHostFragment"

      • app:navGraph="@navigation/nav_graph"

      • app:defaultNavHost="true"(拦截返回键)。

  3. 导航控制器 (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


三、高级功能

  1. 转场动画

    • XML 配置:在 Action 标签中设置 enterAnimexitAnim 等属性。

    • 动态配置

      val options = navOptions { anim { enter = R.anim.fade_in }
      }
      findNavController().navigate(R.id.action_id, null, options)

  2. 深层链接 (Deep Link)

    • 导航图中配置:

      <deepLink android:uri="app://detail/{id}" />

    • 通过 PendingIntent 或 URL 直接跳转到指定 Fragment。

  3. 与 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 官方文档。

http://www.xdnf.cn/news/1008379.html

相关文章:

  • 第十节 高频代码题-类型推断题
  • 硬件工程师成长之路--电容
  • 在GIS 工作流中实现数据处理(3)
  • 25年春招:携程java开发一面
  • linux使用find搜索文件命令
  • VUE - AxiosError-ERR_BAD_REQUEST
  • 瓷器数字化展示文物三维扫描建模-中科米堆
  • 2025年6月英语六级作文高分模板目录(共20篇)
  • ssc377d在kernel下读写寄存器
  • 进程间通信之消息队列
  • 大厂机试题解法笔记大纲+按知识点分类+算法编码训练
  • Coze搭建工作流
  • DWS层新增指标处理方案
  • 工程项目管理软件选型指南:核心功能、技术架构与行业实践
  • 获取分布式锁
  • 医院部署IBMS系统时,哪些关键因素需要重点权衡与规划
  • 【C语言】*与深层理解
  • 【Vue3/Typescript】从零开始搭建H5移动端项目
  • 【二分模版------左闭右闭】
  • Vue ⑨-Pinia
  • c++ - 关于 string 的练习题
  • 《深度剖析:Java中用Stanford NLP工具包优化命名实体识别》
  • Redis哨兵机制
  • 获取Unity节点路径
  • ✅ [Dify]明道云同步内容到 Dify 知识库的最佳实践指南
  • 电梯钢带安全无盲区:电梯钢带断丝智慧监测方案让隐患“毫秒现形“
  • SpringCloud-seata集成到nacos
  • 实战二:基于网页端实现与大模型的问答交互
  • 虚拟 DOM Diff 算法详解
  • UE5场景漫游——鼠标控制旋转与第一人称漫游