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组件来管理应用内的导航。
联系我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka Producer之幂等性

文章目录 1. 启用幂等性2. 底层变化3. 数据不重复4. 数据有序 幂等性通过消耗时间和性能的方式&#xff0c;解决乱序和重复问题。 但是只能保证同一生产者在一个分区中的幂等性。 1. 启用幂等性 //创建producerHashMap<String, Object> config new HashMap<>();…

怎样在 PostgreSQL 中优化对大表的分区裁剪和索引选择?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对大表的分区裁剪和索引选择一、分区裁剪&#xff1a;精准切割&#xff0c;提…

SQL Server 和 MySQL 的主要区别

架构 SQL Server 微软开发&#xff0c;闭源商业数据库运行在 Windows 和 Linux单一数据库引擎架构支持多个数据库实例和多种数据存储机制&#xff08;行存储和列存储&#xff09;包含数据库引擎、SQL Server Agent、SQL Server Reporting Services (SSRS)、SQL Server Integrat…

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑&#xff1a; 实验任务&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流…

QML基本类型

QML基本数据类型之 int使用案例代码 <span style"color:#4b4b4b"><span style"background-color:#ffffff"><code class"language-JavaScript"><span style"color:#008000">// 定义 >> 整型&#xff08…

go-zero框架入门

go-zero框架环境的安装 goctl 若想用go-zero框架&#xff0c;还需要一些前置条件&#xff1a; 安装goctl go install github.com/zeromicro/go-zero/tools/goctllatest可以使用 goctl 命令查看是否安装成功 成功后安装protoc goctl env check --install --verbose --force…

如何免费用java c#实现手机在网状态查询

今天分享手机在网状态查询接口&#xff0c;该接口适用的场景非常广泛&#xff01;首先我们先讲下什么是手机在网状态&#xff1f;简单来说&#xff0c;就是你得手机号是否还在正常使用中&#xff0c;是否能够及时接收和回复信息&#xff0c;是否能够随时接听和拨打电话。如果你…

【Android】基础—基本布局

【Android】基础—基本布局 基本布局 线性布局 垂直方向&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"…

深度学习根据代码可视化模型结构图的方法

方法1. Netron Netron 是一个支持多种深度学习模型格式的可视化工具&#xff0c;可以将 PyTorch 模型转换为 ONNX 格式&#xff0c;然后使用 Netron 进行可视化。 安装 Netron&#xff1a; pip install netron使用示例&#xff1a; import torch.onnx# 定义模型 model EMA…

趣谈linux操作系统 9 网络系统-读书笔记

文章目录 网络协议栈基础知识回顾网络分层网络分层的目的各层作用简介延伸-ip地址,有类,无类,cidr socket实现分析tcp/udp回顾socket编程回顾TCP编程回顾UDP编程回顾差异 socket相关接口实现浅析sokcet实现解析创建socket的三个参数socket函数定义及其参数创建socket结构体关联…

k8s学习——升级后的k8s使用私有harbor仓库

升级后的k8s使用了第三方的容器管理器&#xff0c;安装了nerdctl工具来替代docker进行镜像管理。但是使用docker build打包并上传至harbor仓库的镜像&#xff0c;在部署过程中始终拉不下来&#xff0c;报错证书错误。通过journalctl -xe |grep kubelet 或 journalctl -xe |grep…

MYSQL调优详解:案例解析(第40天)

系列文章目录 一、数据库设计优化 二、查询优化 三、架构优化 四、其他优化策略 五、优化案例解析 文章目录 系列文章目录前言一、数据库设计优化二、查询优化三、架构优化四、其他优化策略五、优化案例解析案例一&#xff1a;优化SELECT查询案例二&#xff1a;使用索引案例三…

【TAROT学习日记】韦特体系塔罗牌学习(3)——女祭司 THE HIGH PRIESTESS II

韦特体系塔罗牌学习&#xff08;3&#xff09;——女祭司 THE HIGH PRIESTESS II 目录 韦特体系塔罗牌学习&#xff08;3&#xff09;——女祭司 THE HIGH PRIESTESS II牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际财富5. 其他象征意 逆位…

赛氪网贡献突出受表彰,中国计算机应用大会颁奖盛典

2024年7月17日&#xff0c;第39届中国计算机应用大会&#xff08;CCF NCCA 2024&#xff09;在万众瞩目中隆重举行&#xff0c;期间举办了盛大的颁奖典礼。此次颁奖典礼对中国计算机应用技术大赛的各大赛道进行了表彰&#xff0c;其中包括“CCF CAT全国算法精英大赛”“全国智能…

node-red学习

Node-RED : 起步 1、安装nodejs Node.js — 在任何地方运行 JavaScript 验证 2、更换下载源 // 查看当前下载地址 npm config get registry // 设置淘宝镜像的地址 npm config set registry https://registry.npmmirror.com/ // 查看当前的下载地址 npm config get registry…

CSS-1_0 CSS和文档流

文章目录 CSS和文档流如何证明这个流的存在呢&#xff1f;流和display番外&#xff1a;inline-block 碎碎念 CSS和文档流 首先什么叫流呢&#xff1f; 通常来说&#xff0c;我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果&#xff0c;这种一个接一个输出的方式…

rk3568 Android12 调整默认音量

rk3568 Android12 调整默认音量 Android首次开机时默认音量的修改在实际生活中具有重要作用。默认音量设置影响了用户体验和设备的适应性。通过设置一个合适的默认音量,可以在用户首次使用设备时提供更舒适和合适的音量水平,避免出现过低或过高的音量引发的不便或不适。这对…

计算机视觉主流框架及其应用方向

文章目录 前言一、计算机视觉领域的主要框架1、深度学习框架1.1、TensorFlow1.2、PyTorch 2、神经网络模型2.1、卷积神经网络&#xff08;CNN&#xff09;2.2、循环神经网络&#xff08;RNN&#xff09; 二、框架在计算机视觉任务中的应用1、TensorFlow1.1、概述&#xff1a;1.…

前端:Vue学习-2

前端&#xff1a;Vue学习-2 1. vue的生命周期2. 工程化开发和脚手架Vue CLI2.1 组件化开发2.2 scoped解决样式冲突2.3 data是一个函数2.4 组件通信2.5 非父子通信- event bus事件&#xff0c;provide&inject 3.v-model原理->实现父子组件双向绑定4. sync 修饰符->实现…

PyTorch垃圾分类任务与垃圾图片数据集

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 人工智能用于垃圾分类 人工智能用于垃圾分类&#xff0c;业界早有过相关的讨论&#xff0c;主要有三种方案&#xff1a;第一种方案&#xff0c;把垃圾的相关信息制成表格化数据&#xff0c;然后用传统的机器学习方法实现分…