【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

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

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

相关文章

教师如何打造专属私密成绩查询系统?

期末的校园&#xff0c;被一种特殊的氛围所笼罩。老师们如同辛勤的工匠&#xff0c;精心打磨着每一个教学环节。复习阶段&#xff0c;他们在知识的宝库中精挑细选&#xff0c;把一学期的重点内容一一梳理&#xff0c;为学生们打造出系统的复习框架。课堂上&#xff0c;他们激情…

.NET周刊【12月第3期 2024-12-15】

国内文章 重磅推出 Sdcb Chats&#xff1a;一个全新的开源大语言模型前端 https://www.cnblogs.com/sdcb/p/18597030/sdcb-chats-intro Sdcb Chats是一个新推出的开源大语言模型前端&#xff0c;旨在提升用户交互体验&#xff0c;并填补市场上基于.NET的前端空白。它引入树状…

专栏二十三:Python读取和分析空间数据的经验杂谈

部分情况同样适合单细胞的分析结果 读取数据阶段 1.错误的library_id 包括sc和sq的两种读取方式&#xff0c;大同小异。 理论上有h5数据和spatial文件夹就可以读取成功&#xff0c;并且自动赋予和文件名一样的library_id&#xff0c;例如 slide sq.read.visium("/ho…

Pandas系列|第二期:Pandas中的数据结构

1.Pandas中的数据结构&#xff1a;Series和DataFrame Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…

如何在谷歌浏览器中启用语音搜索

想象一下&#xff0c;你正在拥挤的地铁上&#xff0c;双手都拿着沉重的购物袋&#xff0c;突然你想搜索附近的咖啡馆。此时如果你能通过语音而不是打字来进行搜索&#xff0c;那将多么的便利&#xff01;在谷歌浏览器中&#xff0c;启用语音搜索功能就是这么简单而高效&#xf…

GCP GCA认证考试Case错题库1(JenciMart+Helicopter+EHR)

GCP GCA认证考试Case错题库1(JenciMartHelicopterEHR) 整理by Moshow郑锴https://zhengkai.blog.csdn.net/ JenciMart 在生产和开发资源之间进行管理职责分离的最小权限模型中&#xff0c;最佳实践是每个应用程序的每个阶段都有自己的项目。这种设置确保权限是细化的&#xf…

MySQL HA 方案 MMM、MHA、MGR、PXC 对比

MySQL高可用架构 MMM (Multi Master Replication Manager) 资源数量说明主DB2用于主备模式的主主复制从DB0~N台可以根据需要配置N台从服务器IP地址2n1N为MySQL服务器的数量监控用户1用户监控数据库状态的MySQL用户(replication)代理用户1用于MMM代理端改变read_only状态 故障…

ISO17025最新认证消息

ISO17025认证是国际上广泛认可的实验室管理标准&#xff0c;全称为《检测和校准实验室能力的通用要求》&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&#xff08;IEC&#xff09;联合发布。以下是对ISO17025最新认证消息及相关内容的归纳&#xf…

npm淘宝镜像

通过命令行配置npm的淘宝镜像源和官方镜像源&#xff0c;以及如何安装和使用cnpm来解决安装包卡顿或无法安装的问题。通过设置registry和disturl&#xff0c;配合清理缓存&#xff0c;可以优化npm的下载速度。 1、​官方默认镜像 npm config set registry https://registry.n…

java12.24日记

运算符&#xff1a; 算术运算符&#xff1a; 顾名思义进行算数运算的 多为&#xff1a;四则运算&#xff0c;加一个取余 &#xff0c;-&#xff0c;*&#xff0c;/以及 %&#xff08;取余&#xff09; 而外的&#xff1a;自增 以及自减--&#xff0c;对原数进行1或者-1 i…

SAP SD销售订单处理流程

本篇博文中的流程&#xff1a; 创建销售订单→依据销售订单创建交货单→依据销售订单开票 一、VA01创建销售订单 1、填入必填项&#xff0c;回车。可点击左上角的依照参考创建按钮。 依照参考创建可以参考以下6个。其中询价单、报价单、订单、合同和计划协议可以理解为特殊的…

内网穿透ubuntu20 docker coplar

sudo apt-get install curl curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash ubuntu-base报错 /sbin/init:No such file or directory解决办法 apt install systemd 命令安装即可 cpolar version 1.3 token认证 登录cpolar官网后台…

怎么设置电脑密码?Windows和Mac设置密码的方法

为电脑设置密码是保护个人信息安全的重要措施。无论是Windows系统还是MacOS系统&#xff0c;设置密码的步骤都相对简单&#xff0c;但需要根据不同的操作系统选择不同的方法。 一、Windows系统电脑密码设置 方法一&#xff1a;通过控制面板设置账户密码 点击桌面左下角的“开…

机器学习DAY3 : 线性回归与最小二乘法与sklearn实现 (线性回归完)

线性回归 线性回归是一种较为简单&#xff0c;但十分重要的机器学习方法。掌握线性的原理及求解方法&#xff0c;是深入了解线性回归的基本要求。除此之外&#xff0c;线性回归也是监督学习回归部分的基石&#xff0c;希望你能通过本文掌握机器学习的一些重要的思想。 知识点…

Linux下编译安装Kokkos

本文记录在Linux下编译安装Kokkos的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 二、编译安装 参考文献 Mills R T. PETSc/TAO Developments for Early Exascale Systems[J]. 2024.Josef R. A Stud…

eMMC 存储分区结构解析

一、eMMC 存储分区结构图 分区 用途 Boot Area Partitions 存储引导加载程序&#xff0c;支持安全启动和恢复模式 RPMB Partition 存储安全关键数据&#xff0c;防止重放攻击 General Purpose Partitions OEM 自定义数据分区&#xff0c;用于特定功能或镜像存储 User D…

攻防世界web第一题

最近开始学习网络安全的相关知识&#xff0c;开启刷题&#xff0c;当前第一题 题目为攻防世界web新手题 这是题目 翻译&#xff1a;在这个训练挑战中&#xff0c;您将了解 Robots_exclusion_standard。网络爬虫使用 robots.txt 文件来检查是否允许它们对您的网站或仅网站的一部…

C++可执行文件参数解析

前言 针对简单工程甚至是单cpp文件&#xff0c;C可执行二进制的参数获取&#xff0c;getopt被用来解析命令行选项参数。该接口在unix的头文件<unistd.h>中定义。参数类型区分为短参数&#xff08;只有一个中划线’-&#xff09;、长参数&#xff08;有2个中划线‘–’&a…

跟踪方案和小语法

语法一&#xff1a; case when cond1 then res1 [when cond2 then res2] else res end; 这种语法用于条件判断&#xff0c;其中 cond1 和 cond2 是需要评估的条件。如果 cond1 为真&#xff0c;则执行 res1。如果 cond1 为假&#xff0c;程序会继续检查 cond2&#xff0c;如果…

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…