Android中的导航navigation的使用
Android中的导航(Navigation)是一种应用程序设计模式,它通过使用统一的用户界面来管理应用程序中的各种界面和交互。在Android中,导航主要通过使用Navigation SDK来实现,该SDK提供了一组工具和组件,可以帮助开发人员构建具有一致性和可访问性的用户界面。
下面是使用Android导航的详细步骤:
- 添加依赖项:首先,确保在项目的build.gradle文件中添加了Android Navigation的依赖项。可以使用Gradle或Maven进行管理。
dependencies {implementation 'androidx.navigation:navigation-fragment-ktx:2.x.x'implementation 'androidx.navigation:navigation-ui-ktx:2.x.x'
}
- 创建Navigation Graph:导航图(Navigation Graph)是一个XML文件,用于描述应用程序中的各种界面和交互。它定义了从一个界面到另一个界面的导航路径。可以使用Android Studio中的导航编辑器来创建和编辑导航图。
- 使用导航组件:导航SDK提供了多种导航组件,例如Navigation Drawer、Navigation Menu、Fragment Transitions等,可以根据需要选择合适的组件。可以使用布局编辑器将导航组件添加到布局文件中,并使用相应的代码进行配置。
- 配置界面:在导航图中定义了各种界面,包括Activity、Fragment等。需要将这些界面添加到导航图中,并指定它们之间的导航关系。
- 启动导航:可以使用
Navigation类来启动导航。可以通过调用findNavController()方法获取对导航控制器(Navigation Controller)的引用,并使用该控制器来执行导航操作。 - 实现自定义导航动作:如果需要实现自定义导航动作,可以在导航图中定义自定义动作,并使用相应的代码实现。可以使用
Navigation类提供的API来执行自定义动作,例如navigate()方法。 - 调试和测试:使用Android Studio中的调试工具和模拟器来测试应用程序中的导航功能,确保导航图和代码正确无误。
使用例子
如下是一个在Android中使用Kotlin进行导航的一个简单例子,涉及创建一个简单的应用程序,其中包含一个底部的导航栏,用户可以通过它从一个屏幕导航到另一个屏幕。以下是实现这一功能的基本步骤:
- 添加依赖项:确保在
build.gradle(Module: app)文件中添加了Android Navigation组件的依赖项。
dependencies {implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'implementation 'androidx.lifecycle:lifecycle-fragment:2.4.1'
}
- 创建BottomNavigationView:在布局文件中添加
BottomNavigationView。
<!-- res/layout/activity_main.xml -->
<androidx.constraintlayout.widget.ConstraintLayout 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"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.bottomnavigation.widget.BottomNavigationViewandroid:id="@+id/nav_view"android:layout_width="0dp"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:itemBackground="@color/colorPrimary"app:itemIconTint="@android:color/white"app:itemTextColor="@android:color/white" /></androidx.constraintlayout.widget.ConstraintLayout>
- 配置Navigation Graph:创建一个导航图,定义几个目标(Destinations),例如
FirstFragment,SecondFragment, 和ThirdFragment。
<!-- res/navigation/nav_graph.xml -->
<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"android:id="@+id/nav_graph"app:startDestination="@+id/firstFragment"><fragmentandroid:id="@+id/firstFragment"android:name=".FirstFragment"android:label="First Fragment"tools:layout="@layout/fragment_first"><!-- 添加子导航 --><actionandroid:id="@+id/action_firstFragment_to_secondFragment"app:destination="@+id/secondFragment" /></fragment><fragmentandroid:id="@+id/secondFragment"android:name=".SecondFragment"android:label="Second Fragment"tools:layout="@layout/fragment_second"><actionandroid:id="@+id/action_secondFragment_to_thirdFragment"app:destination="@+id/thirdFragment" /></fragment><fragmentandroid:id="@+id/thirdFragment"android:name=".ThirdFragment"android:label="Third Fragment"tools:layout="@layout/fragment_third"/></navigation>
- 在Activity中设置NavController:在
MainActivity中设置NavController并绑定到BottomNavigationView。
// res/layout/activity_main.xml
// 引入NavController
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import androidx.navigation.NavGraph
import androidx.navigation.Navigationclass MainActivity : AppCompatActivity() {private lateinit var navController: NavControlleroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取BottomNavigationView的NavControllernavController = Navigation.findNavController(this, R.id.nav_view)// 设置NavController的监听器navController.addOnDestinationChangedListener { _, destination, _ ->when (destination.id) {R.id.firstFragment -> {// 执行第一个fragment的逻辑}R.id.secondFragment -> {// 执行第二个fragment的逻辑}R.id.thirdFragment -> {// 执行第三个fragment的逻辑}}}}
}
- 创建Fragments:创建三个Fragment,每个Fragment都有自己的布局和功能。
// res/layout/fragment_first.xml
<!-- 第一个Fragment的布局 -->class FirstFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_first, container, false)}// 第一个Fragment的方法和逻辑
}// res/layout/fragment_second.xml
<!-- 第二个Fragment的布局 -->class SecondFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_second, container, false)}// 第二个Fragment的方法和逻辑
}// res/layout/fragment_third.xml
<!-- 第三个Fragment的布局 -->class ThirdFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_third, container, false)}// 第三个Fragment的方法和逻辑
}
这个例子展示了一个基本的导航流程,用户可以在三个Fragment之间切换。每个Fragment都有其自己的布局和逻辑。通过底部的导航栏,用户可以导航到不同的Fragment。
使用例子2
使用Android Navigation库实现Fragment之间的跳转。下面是一个简单的例子,展示了如何在两个Fragment之间进行导航:
- 首先,创建一个Navigation Graph文件。在你的项目中的
nav_graph.xml文件中,定义你的目的地和路径
<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"android:id="@+id/nav_graph"app:startDestination="@+id/fragment_home"><fragmentandroid:id="@+id/fragment_home"android:name=".ui.fragments.HomeFragment"android:label="Home"><actionandroid:id="@+id/action_home_to_about"app:destination="@id/fragment_about"/></fragment><fragmentandroid:id="@+id/fragment_about"android:name=".ui.fragments.AboutFragment"android:label="About"></fragment>
</navigation>
在这个例子中,我们有两个目的地:HomeFragment和AboutFragment。HomeFragment有一个到AboutFragment的跳转动作(action)。
- 在你的Activity中,获取NavController并启动动作。在你的Activity或Fragment的代码中,使用以下代码:
// 获取NavController
private lateinit var navController: NavController
val navGraph = Navigation.findNavController(this, R.id.nav_host_fragment) as NavController?// 启动动作
val destination = navGraph.destinationForId(R.id.action_home_to_about)?.let { it as? Destination } ?: Destination() // 使用你的动作ID替换R.id.action_home_to_about
val result = navController.navigate(destination) // 导航到AboutFragment
这样就成功地在两个Fragment之间进行了导航。当用户点击按钮或其他触发条件时,这个导航动作就会被启动。此外,跳转动作应该在Navigation Graph文件中定义。
相关文章:
Android中的导航navigation的使用
Android中的导航(Navigation)是一种应用程序设计模式,它通过使用统一的用户界面来管理应用程序中的各种界面和交互。在Android中,导航主要通过使用Navigation SDK来实现,该SDK提供了一组工具和组件,可以帮助…...
Clip算法解读
论文地址:https://arxiv.org/pdf/2103.00020.pdf 代码地址:https://github.com/OpenAI/CLIPz 中文clip代码:https://gitcode.com/OFA-Sys/Chinese-CLIP/overview 一、动机 主要解决的问题: 超大规模的文本集合训练出的 NLP 模…...
使用第三方远程连接工具ssh连接vagrant创建的虚拟机
vagrant默认密码都是vagrant 密码认证默认是关闭的,进入虚拟机,打开密码认证 1、使用命令vi /etc/ssh/sshd_config进入配置,注意要切换到root用户,这个配置root有权限 2、找到PasswordAuthentication默认为no,改为yes 3、重启虚…...
linux查找指定目录下包含指定字符串文件,包含子目录
linux查找指定目录下包含指定字符串的文件,包含子目录 linux查找指定目录下包含指定字符串的指定文件格式,包含子目录 指定目录 cd /home/www/linux查找指定目录下包含指定字符串的文件,包含子目录 grep -r "指定字符串"注释 gr…...
27. BI - PageRank 的那些相关算法 - PersonRank, TextRank, EdgeRank
本文为 「茶桁的 AI 秘籍 - BI 篇 第 27 篇」 Hi, 我是茶桁. 之前咱们用两节课的时间来讲了 PageRank, 包括它的起源, 公式以及工具. 并在一个希拉里邮件的案例中用networkx完成了练习. 在上一节课中, 咱们不仅做了案例, 并且说到了 PageRank 模型的影响力, 并且讲了其中一个…...
[数据集][目标检测]公共场所危险物品检测数据集VOC+YOLO格式1431张6类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1431 标注数量(xml文件个数):1431 标注数量(txt文件个数):1431 标注…...
创业项目开发(持续更新)
最近项目梳理: 一、业务目标 最重要的业务目标就是要能实现自己做事情赚钱。所以有两个维度,第一个维度就是最重要的就是自己做事情。第二个维度才是赚钱。 如果要自己做事情,需要什么样的事情,这个事情的目标是什么࿰…...
基于SpringBoot的“校园台球厅人员与设备管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“校园台球厅人员与设备管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图…...
【Java数据结构】关于栈的操作出栈,压栈,中缀表达式,后缀表达式,逆波兰表达式详解
🔥个人主页:努力学编程’ 🔥内容管理:java数据结构 上一篇文章我们讲过了java数据结构的链表,对于链表我们使用了它的一些基本操作,完成了扑克牌小游戏的操作,如果你感兴趣的话,点…...
wireshark 使用
wireshark介绍 wireshak可以抓取经过主机网卡的所有数据包(包括虚拟机使用的虚拟网卡的数据包)。 环境安装 安装wireshark: https://blog.csdn.net/Eoning/article/details/132141665 安装网络助手工具:https://soft.3dmgame.com/down/213…...
C++纯虚函数的使用
纯虚函数是一种在C中定义抽象基类的方法,它是一个在基类中声明但没有实现的虚函数。 纯虚函数需要在派生类中进行实现,否则派生类也会成为抽象类,无法直接实例化对象。 下面是关于纯虚函数的讲解和代码示例: 纯虚函数的定义&#…...
读所罗门的密码笔记06_共生思想(上)
1. 共生思想 1.1. 1997年5月11日,IBM公司的“深蓝”计算机在与国际象棋世界冠军加里卡斯帕罗夫的第二次对弈时击败了他 1.1.1. 这台超级计算机以3.5∶2.5的战绩胜出,登上了世界各地的新闻头条 1.2. Alpha Zero 1.2.…...
QA:ubuntu22.04.4桌面版虚拟机鼠标丢失的解决方法
前言 在Windows11中的VMWare Workstation17.5.1 Pro上安装了Ubuntu22.04.4,在使用过程中发现,VM虚拟机的鼠标的光标会突然消失,但鼠标其他正常,就是光标不见了,下面是解决办法。 内容 如下图,输入mouse&a…...
idea从零开发Android 安卓 (超详细)
首先把所有的要准备的说明一下 idea 2023.1 什么版本也都可以操作都是差不多的 gradle 8.7 什么版本也都可以操作都是差不多的 Android SDK 34KPI 下载地址: AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 …...
1.5T数据惨遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》
本周态势快速感知 本周全球共监测到勒索事件93起,近三周攻击数量呈现持平状态。 本周Lockbit3.0是影响最严重的勒索家族,Blacksuit和Ransomhub恶意家族紧随其后,从整体上看Lockbit3.0依旧是影响最严重的勒索家族,需要注意防范。 …...
喜讯!聚铭网络荣获《日志分类方法及系统》发明专利
近日,聚铭网络又喜获一项殊荣,其申报的《日志分类方法及系统》发明专利成功获得国家知识产权局的授权,正式荣获国家发明专利证书。 在信息化时代,网络安全问题日益凸显,日志分析作为保障网络安全的重要手段ÿ…...
每日一博 - 关于日志记录的最佳实践
文章目录 概述选择合适的日志等级打印函数的入参、出参打印日志对象要做判空处理,避免阻断流程推荐使用 Slf4j不用e.printStackTrace()打印日志低级别的日志输出,必须进行日志级别开关判断不打印重复日志打印全部的异常信息,方便定位问题核心…...
针对pycharm打开新项目需要重新下载tensorflow的问题解决
目录 一、前提 二、原因 三、解决办法 一、前提 下载包之前,已经打开了,某个项目。 比如:我先打开了下面这个项目: 然后在terminal使用pip命令下载: 如果是这种情况,你下载的这个包一般都只能用在这一个…...
<商务世界>《第29课 外贸展会上应注意的事项》
1 参展前需要知道的问题 1)在开展前,是否发邀请给外商,告诉他们你的展位号,你的企业及产品的优势? 2)你的展位布置是否能够吸引外商? 3)你参展的产品是否具有个性,特色&…...
sklearn主成分分析PCA
文章目录 基本原理PCA类图像降维与恢复 基本原理 PCA,即主成分分析(Principal components analysis),顾名思义就是把矩阵分解成简单的组分进行研究,而拆解矩阵的主要工具是线性变换,具体形式则是奇异值分解。 设有 m m m个 n n …...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
