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

【JetPack】Navigation知识点总结

Navigation的主要元素:

1、Navigation 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"android:id="@+id/my_nav_graph"app:startDestination="@id/homeFragment"><fragmentandroid:id="@+id/homeFragment"android:name="com.example.navigation.HomeFragment"android:label="fragment_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.navigation.DetailFragment"android:label="fragment_detail"tools:layout="@layout/fragment_detail" ><actionandroid:id="@+id/action_detailFragment_to_homeFragment"app:destination="@id/homeFragment" /></fragment>
</navigation>

2、NavHostFragment:
一个特殊的Fragment,可以将它看作是其他Fragment的容器,Navigation Graph中的Fragment正是通过NavHostFragment进行展示的。
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<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.fragment.app.FragmentContainerViewandroid:id="@+id/fragmentContainerView"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="409dp"android:layout_height="729dp"app:defaultNavHost="true"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:navGraph="@navigation/my_nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

3、NavController:
用于在代码中完成Navigation Graph中具体的页面切换工作。

MainActivity.java
public class MainActivity extends AppCompatActivity {NavController navController;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 这样写会报错// NavController navController = Navigation.findNavController(this, R.id.fragmentContainerView);// 需要先通过id获取到对应的NavHostFragment容器NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView);if (navHostFragment != null) {// 如果不为空,再获取到的容器对应的NavControllernavController = navHostFragment.getNavController();} else {throw new RuntimeException("NavHostFragment not found");}// 该代码的主要目的是将 ActionBar(或 Toolbar)与 NavController 关联起来,以便在使用 Android 导航组件时,ActionBar 可以自动更新其显示内容NavigationUI.setupActionBarWithNavController(this, navController);}@Overridepublic boolean onSupportNavigateUp() {// header上返回按键好用return navController.navigateUp();}
}
HomeFragment.java
@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);Button button = getView().findViewById(R.id.button);button.setOnClickListener(view -> {// 由于最外层设置了NavController,所以这里可以通过容器中的view找到NavControllerNavController navController = Navigation.findNavController(view);// 通过NavController进行导航,确定目的地navController.navigate(R.id.action_homeFragment_to_detailFragment);});}
DetailFragment.java
@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);Button button = getView().findViewById(R.id.button2);button.setOnClickListener((v)->{// 由于最外层设置了NavController,所以这里可以通过容器中的view找到NavControllerNavController navController = Navigation.findNavController(v);// 通过NavController进行导航,确定目的地navController.navigate(R.id.action_detailFragment_to_homeFragment);});}

三者之间的关系
当你想切换Fragment时,使用NavController对象,告诉它你想要去Nlavigation Graph中的哪个Fragment,NavController会将你想去的Fragment展示NavHostFragment中
实现顺序
1.创建Fragment
2.创建navgation_graph,指定fragment切换逻辑
3.在Activity的页面中添加navHostFragmrnt容器进行界面显示
4.在Activity中通过navHostFragmrnt获取到navController,并设置bar和fragment的对应关系,以及bar上返回按键生效
5.在需要触发fragment切换的位置通过获取navController进行导航,设置对应的action,确认触发后目的地
添加页面切换动画
在这里插入图片描述

页面之间参数传递
方法一:直接传递bundle对象(接收数据时需要知道对应key值以及value类型,并且需要判空)

        Bundle bundle = new Bundle();bundle.putString("user_name", "Jay");NavController navController = Navigation.findNavController(view);navController.navigate(R.id.action_homeFragment_to_detailFragment, bundle);

接收bundle对象

		Bundle arguments = getArguments();String userName = null;if (arguments != null) {userName = arguments.getString("user_name");Log.d("userName", "" + userName);}

方法二:引入arg插件

		dependencies {// 添加 safe-arg 插件依赖classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.4.0")}plugins {id 'androidx.navigation.safeargs'}
        Bundle bundle = new HomeFragmentArgs.Builder().setUserName("Jay").setAge(20).build().toBundle();HomeFragmentArgs args = HomeFragmentArgs.fromBundle(getArguments());String username = args.getUserName();int age = args.getAge();Log.d("Test", "userName = " + userName + "age = " + age);

NavigationUI的使用场景
Fragment切换时,设计到AppBar上的内容显示,为了方便统一管理引入NavigationUI

public class MainActivity extends AppCompatActivity {private NavController navController;private AppBarConfiguration appBarConfiguration;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView);if (navHostFragment != null) {navController = navHostFragment.getNavController();}appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();// 将Appbar与Navigation建立联系NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {super.onCreateOptionsMenu(menu);getMenuInflater().inflate(R.menu.menu_settings, menu);return true;}// 响应Meun的点击事件@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {return NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item);}// 响应AppBar的返回按键@Overridepublic boolean onSupportNavigateUp() {return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp();}
}

跳转后的假面不显示meun

    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {setHasOptionsMenu(true);return inflater.inflate(R.layout.fragment_setting, container, false);}@Overridepublic void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {menu.clear();super.onCreateOptionsMenu(menu, inflater);}

监听页面切换完成的回调

        // 监听界面切换完成navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {@Overridepublic void onDestinationChanged(@NonNull NavController navController, @NonNull NavDestination navDestination, @Nullable Bundle bundle) {Log.d("test","onDestinationChanged");}});

深层链接DeepLink之PendingIntent

private void sendNotifycation() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel myChannel = new NotificationChannel(getActivity().getPackageName(), "MyChannel", NotificationManager.IMPORTANCE_DEFAULT);myChannel.setDescription("My NotificationChannel");NotificationManager notificationManager = getActivity().getSystemService(NotificationManager.class);notificationManager.createNotificationChannel(myChannel);}NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity(), getActivity().getPackageName()).setSmallIcon(R.drawable.ic_launcher_background).setContentTitle("Deep Link").setContentText("点我").setPriority(NotificationManager.IMPORTANCE_DEFAULT).setContentIntent(getPendingIntent());// 发送通知NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getActivity());if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}notificationManager.notify(notifyId++, builder.build());}private PendingIntent getPendingIntent() {Bundle bundle = new Bundle();bundle.putString("name","Jay");return Navigation.findNavController(getActivity(),R.id.button).createDeepLink().setGraph(R.navigation.my_nav_graph).setDestination(R.id.detailFragment).setArguments(bundle).createPendingIntent();}

深层链接DeepLink之Url

相关文章:

【JetPack】Navigation知识点总结

Navigation的主要元素&#xff1a; 1、Navigation Graph&#xff1a; 一种新的XML资源文件,包含应用程序所有的页面&#xff0c;以及页面间的关系。 <?xml version"1.0" encoding"utf-8"?> <navigation xmlns:android"http://schemas.a…...

InnoDB引擎的内存结构

InnoDB擅长处理事务&#xff0c;具有自动崩溃恢复的特性 架构图&#xff1a; 由4部分组成&#xff1a; 1.Buffer Pool&#xff1a;缓冲池&#xff0c;缓存表数据和索引数据&#xff0c;减少磁盘I/O操作&#xff0c;提升效率 2.change Buffer&#xff1a;写缓冲区&#xff0c…...

Y3地图制作1:水果缤纷乐、密室逃脱

文章目录 一、水果缤纷乐1.1 游戏设计1.1.1 项目解析1.1.2 项目优化1.1.3 功能拆分 1.2 场景制作1.2.1 场景需求1.2.2 创建主镜头、绘制草稿&#xff0c;构思文案和情景1.2.3 构建场景地图1.2.4 光源与氛围设置 1.3 游戏初始化1.3.1 物编、UI预设置1.3.2 游戏初始化1.3.2 玩家初…...

ESP32_H2(IDF)学习系列-ADC模数转换(连续转换)

一、简介&#xff08;节选手册&#xff09; 1 概述 ESP32-H2 搭载了以下模拟外设&#xff1a; • 一个 12 位逐次逼近型模拟数字转换器 (SAR ADC)&#xff0c;用于测量最多来自 5 个管脚上的模拟信号。 • 一个温度传感器&#xff0c;用于测量及监测芯片内部温度。 2 SAR ADC 2…...

如何通过TikTok成功引流到独立站

随着短视频平台的迅猛发展&#xff0c;TikTok已成为全球最受欢迎的社交媒体之一&#xff0c;尤其是在年轻用户群体中更是势不可挡。如果你是一个独立站&#xff08;如电商网站、博客、个人品牌站等&#xff09;的运营者&#xff0c;那么如何通过TikTok引流到独立站已经成为一个…...

生成签名文件 .keystore

打开java sdk 到bin目录&#xff08;D:\JDK\Java\jdk1.8.0_202\bin&#xff09;&#xff0c;打开dos窗口执行以下命令&#xff1a; 命令行输入&#xff1a; 1、生成签名文件&#xff1a;&#xff08;-alias 别名 validity 有效期 9125 天&#xff09; keytool -genkeypair -v…...

Mono里运行C#脚本3—mono_jit_init

前面已经介绍了配置参数的读取,这样就可以把一些特殊的配置读取进来,完成了用户配置阶段的参数,接着下来就需要进行大工程的建造了。 为什么这样说呢,因为需要解释并执行C#编译的受托管的代码,相当于就是建立一个C#代码运行的虚拟机,而这个虚拟机还是很复杂的,不但要支…...

龙迅#LT6911C适用于HDMI转MIPI/LVDS产品应用,分辨率高达4K30HZ,内置程序,支持KEY(HDCP)!

1. 描述 LT6911C 是一款高性能 HDMI1.4/DP 转 MIPIDSI/CSI/LVDS 芯片&#xff0c;适用于 VR/智能手机/显示应用。 对于 MIPIDSI/CSI 输出&#xff0c;LT6911C具有可配置的单端口或双端口 MIPIDSI/CSI&#xff0c;具有 1 个高速时钟通道和 1~4 个高速数据通道&#xff0c;运行…...

阿里云虚拟主机ecs镜像如何转移到本地virtualbox上

导出阿里云 ECS 镜像 创建快照:登录阿里云 ECS 控制台,找到对应的 ECS 实例,创建一个快照,等待快照创建完成。创建自定义镜像:基于创建好的快照,创建一个自定义镜像,填写镜像名称和描述等信息。导出镜像:镜像创建完成后,点击 “导出镜像”,并授权访问,将镜像导出到阿…...

虚拟机桥接模式

主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单&#xff1a;编辑>虚拟机网络编辑&#xff0c;点击“更改设置”&#xff0c;可以看到三个网卡&#xff0c;这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0&#xff0c;如果没看到这个网卡&…...

酷睿i7和i5哪个好?i5和i7的区别介绍

在英特尔酷睿处理器家族中&#xff0c;i7与i5作为面向不同用户群体的主流产品&#xff0c;各自承载着不同的性能定位与使用价值。在面对“酷睿i7和i5哪个好”的问题时&#xff0c;答案并非一概而论&#xff0c;而是取决于具体的应用需求、预算考量以及对性能与效率的期待。本文…...

STM32 高级 谈一下IPV4/默认网关/子网掩码/DNS服务器/MAC

首先可以通过 winr->输入cmd->输入ipconfig 命令可以查看计算机的各种地址 IPV4&#xff1a;是互联网协议第 4 版&#xff08;Internet Protocol version 4&#xff09;所使用的地址。它是一个 32 位的二进制数字&#xff0c;通常被分为 4 个 8 位的部分&#xff…...

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…...

消息队列(二)消息队列的高可用原理

高可用的定义 上一篇文章提过&#xff0c;引入了消息队列的优势在于解耦、并发和缓冲&#xff0c;代价就是让程序的复杂性上升&#xff0c;引入了消息队列后&#xff0c;就需要考虑消息队列对于系统整体的影响&#xff0c;此时消息队列的稳定和健壮就是重中之重。也就是消息队…...

大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库

大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客&#xff1a;https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…...

深入理解索引的最左匹配原则:底层逻辑解析

1. 什么是最左匹配原则&#xff1f; 最左匹配原则是指在使用复合索引时&#xff0c;查询条件从左到右依次匹配索引列的顺序&#xff0c;一旦中间有列未匹配&#xff0c;索引将停止工作或部分失效。 1.1 举例说明 假设我们有一张用户表&#xff08;users&#xff09;&#xf…...

微服务——数据管理与一致性

1、在微服务架构中&#xff0c;每个微服务都有自己的数据库&#xff0c;这种设计有什么优点和挑战&#xff1f; 优点挑战服务自治&#xff1a;每个微服务可独立选择适合自己的数据库类型。数据一致性&#xff1a;跨微服务的事务难以保证强一致性。故障隔离&#xff1a;一个微服…...

Docker之技术架构【八大架构演进之路】

Docker之技术架构 1. 八大架构演进之路1.1 单机架构1.2 应用数据分离架构1.3 应用服务集群架构1.4 读写分离架构1.5 冷热分离架构1.6 垂直分库架构1.7 微服务架构1.8 容器编排架构&#xff08;docker出现&#xff09; 2. 一个互联网实战架构 本章意在让大家了解Docker出现的历史…...

CSP-X2024山东小学组T4:刷题

题目链接 CSP-X2024山东小学组T4&#xff1a;刷题 题目描述 比赛之路多艰&#xff0c;做题方得提升。努力刷题的人在比赛中往往能取得很好的成绩&#xff0c;小红就是这样的人。 为了继续提升自己的编程实力&#xff0c;小红整理了一份刷题题单&#xff0c;并选中了题单中的…...

【Windows指令】Windows常用快捷指令

一.查找系统上所有可用的 .cpl 文件 要查找系统上所有可用的 .cpl 文件&#xff0c;你可以浏览到以下目录&#xff1a; C:\Windows\System32在“System32”文件夹中搜索扩展名为 .cpl 的文件&#xff0c;将列出所有可用的控制面板小程序。 ❗某些 .cpl 文件可能仅存在于特定的…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...

【Redis】Redis从入门到实战:全面指南

Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...