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

Android Navigation 组件原理和使用教程

Android Navigation 组件是用于简化导航相关操作的框架,允许你在应用中管理应用内各个部分之间的导航。该组件是Android Jetpack的一部分,主要包含三个部分:导航图(NavGraph)、NavHost和NavController。

一、原理
  1. Navigation Graph(导航图):定义了应用中各个页面及其间的可能路径。它是一个XML文件,包含应用的所有目的地(Destination)和这些目的地之间的连接(Actions)。

  2. NavHost:是一个空的容器,用于显示导航图中的每个目的地。最常用的是NavHostFragment,它是一个特殊的Fragment,用于管理导航图。

  3. NavController:管理应用的导航和控制导航图中的导航操作。每个NavHost都有一个与之关联的NavController。

二、使用详细教程
1. 添加依赖项

首先,需要在项目的build.gradle文件中添加Navigation组件的依赖项:

dependencies {def nav_version = "2.5.3"implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
2. 创建导航图

res/navigation目录下创建一个新的导航图文件,比如nav_graph.xml,并定义各个目的地和动作:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"app:startDestination="@id/homeFragment"><fragmentandroid:id="@+id/homeFragment"android:name="com.example.app.HomeFragment"android:label="Home"tools:layout="@layout/fragment_home" ><actionandroid:id="@+id/action_homeFragment_to_detailFragment"app:destination="@id/detailFragment" /></fragment><fragmentandroid:id="@+id/detailFragment"android:name="com.example.app.DetailFragment"android:label="Detail"tools:layout="@layout/fragment_detail" />
</navigation>
3. 设置NavHostFragment

在你的Activity的布局文件中添加NavHostFragment

<androidx.fragment.app.FragmentContainerViewandroid:id="@+id/nav_host_fragment"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="match_parent"android:layout_height="match_parent"app:navGraph="@navigation/nav_graph"app:defaultNavHost="true" />
4. 配置NavController

在你的Activity中配置NavController:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragmentval navController = navHostFragment.navController// 配置ActionBar与NavController联动setupActionBarWithNavController(navController)}override fun onSupportNavigateUp(): Boolean {val navController = findNavController(R.id.nav_host_fragment)return navController.navigateUp() || super.onSupportNavigateUp()}
}
5. 在Fragment中导航

在你的Fragment中使用NavController进行导航:

class HomeFragment : Fragment(R.layout.fragment_home) {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val navController = findNavController()view.findViewById<Button>(R.id.button_navigate).setOnClickListener {navController.navigate(R.id.action_homeFragment_to_detailFragment)}}
}

详细语法讲解

  1. 导航图:通过定义XML文件来描述应用中的各个目的地和它们之间的关系。

  2. NavHostFragment:作为容器展示当前目的地的Fragment。

  3. NavController:用于控制导航操作,提供navigate方法进行导航。

  4. 导航动作(Actions):在导航图中定义,用于描述从一个目的地到另一个目的地的路径。

  5. 导航参数:可以在导航时传递数据,使用SafeArgs插件生成类型安全的参数。

  6. 返回栈管理NavController会自动管理返回栈,你也可以通过navigateUp等方法进行自定义处理。

示例代码

1. 安装SafeArgs插件

在项目的build.gradle文件中添加:

buildscript {dependencies {classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"}
}apply plugin: 'androidx.navigation.safeargs'
2. 在导航图中定义参数
<fragmentandroid:id="@+id/detailFragment"android:name="com.example.app.DetailFragment"android:label="Detail"tools:layout="@layout/fragment_detail"><argumentandroid:name="itemId"app:argType="integer" />
</fragment>
3. 在代码中传递参数
val action = HomeFragmentDirections.actionHomeFragmentToDetailFragment(itemId = 1)
navController.navigate(action)
4. 在目标Fragment中接收参数
class DetailFragment : Fragment(R.layout.fragment_detail) {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val args: DetailFragmentArgs by navArgs()val itemId = args.itemId// 使用itemId进行操作}
}

通过以上步骤,你可以非常详细地理解和使用Android Navigation组件来管理应用内的导航。
联系我

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 面试问题:React基本概念,和所遇到的CPU和IO问题
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • Java面试题--JVM大厂篇之深入解析JVM中的Serial GC:工作原理与代际区别
  • spdlog源码学习:std::unique_ptr订制删除器,guard用法,以及decltype
  • Python面试整理-Python中的函数定义和调用
  • Linux工具相关介绍
  • 网络通讯实验报告
  • jenkins 使用教程
  • 3226 使两个整数相等的位更改次数
  • 鸿蒙OpenHarmony Native API【HiLog】
  • PyQt5学习路线
  • 上海昇腾AI训练营笔记
  • mysql8和mysql5版本在使用mybatis框架时的注意事项
  • 主流大数据调度工具DolphinScheduler之数据采集
  • 移动硬盘在苹果电脑上使用后在windows中无法读取 Win和Mac的硬盘怎么通用
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【mysql】环境安装、服务启动、密码设置
  • 【RocksDB】TransactionDB源码分析
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • dva中组件的懒加载
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Median of Two Sorted Arrays
  • MQ框架的比较
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • spring + angular 实现导出excel
  • 百度小程序遇到的问题
  • 关于 Cirru Editor 存储格式
  • 力扣(LeetCode)56
  • 数据结构java版之冒泡排序及优化
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我的zsh配置, 2019最新方案
  • 小程序 setData 学问多
  • Semaphore
  • #define与typedef区别
  • #NOIP 2014#Day.2 T3 解方程
  • $.ajax()参数及用法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (NSDate) 时间 (time )比较
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (四) Graphivz 颜色选择
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET Micro Framework初体验
  • .NET MVC第三章、三种传值方式
  • .net web项目 调用webService
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .net的socket示例
  • @Autowired多个相同类型bean装配问题
  • @RequestMapping-占位符映射
  • [1204 寻找子串位置] 解题报告
  • [AI Google] Ask Photos: 使用Gemini搜索照片的新方法
  • [AI 大模型] Meta LLaMA-2
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解