android jetpack Navigation的使用(java)

news2024/11/19 5:41:48

简介

Navigation通过图形化的方式管理配置页面的切换。

基本使用

  1. 添加依赖
    implementation 'androidx.navigation:navigation-fragment:2.5.3'
    implementation 'androidx.navigation:navigation-ui:2.5.3'
  1. 创建xml文件(添加导航图)——nav_graph.xml
    在这里插入图片描述
    在这里插入图片描述
    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"
             android:id="@+id/nav_graph">


</navigation>
  1. 向activity中添加NavHost
    通过activity的xml布局文件添加FragmentContainerView和NavHostFragment。
    app:navGraph 将NavHostFragment与导航图关联
    app:defaultNavHost=“true” 使得NavHostFragment 会响应系统的返回点击事件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


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

</LinearLayout>
  1. 在导航图中添加目的地
    这里添加了BlankFragment。
    app:startDestination 起始目的地,第一次进入看到的界面
    在这里插入图片描述

  2. 目的地建立联系
    拖住圆圈到目的fragment,自动建立联系。
    在这里插入图片描述
    建立联系后,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/nav_graph"
    app:startDestination="@id/blankFragment">


    <activity
        android:id="@+id/mainActivity"
        android:name="cn.jn.mytest.MainActivity"
        android:label="MainActivity" />


    <fragment
        android:id="@+id/blankFragment"
        android:name="cn.jn.mytest.BlankFragment"
        android:label="fragment_blank"
        tools:layout="@layout/fragment_blank" >
        <action
            android:id="@+id/action_blankFragment_to_cragment2"
            app:destination="@id/cragment" />
    </fragment>

    <fragment
        android:id="@+id/cragment"
        android:name="cn.jn.mytest.Cragment"
        android:label="fragment_cragment"
        tools:layout="@layout/fragment_cragment" />
</navigation>
  1. 导航到目的地

6.1 在activity中使用NavController进行导航
nav_host_fragment为FragmentContainerView

        NavHostFragment navHostFragment =
                (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
        NavController navController = navHostFragment.getNavController();

6.2 使用插件Safe Args导航,在项目build.gradle文件中添加配置.

plugins {
    id 'com.android.application' version '7.4.2' apply false
    id 'com.android.library' version '7.4.2' apply false

    id 'androidx.navigation.safeargs' version '2.5.3' apply false
}

在app下的build.gradle文件中添加配置

plugins {
    id 'com.android.application'
    id 'androidx.navigation.safeargs'
}

android {
	........
}

配置好后,Safe Args会根据nav_graph.xml文件生成代码。生成的类的名称由源目的地类的名称和“Directions”一词组成。根据上面的设置,我要在BlankFragment跳转到cragment,生成类的名字就是BlankFragmentDirections,BlankFragmentDirections中的方法,名称组成:action开头+源目的地名称+to+目的地名称,我这边生成的方法名为actionBlankFragmentToCragment。通过BlankFragmentDirections获取NavDirections,再将其传到navigate中,就完成了跳转。

在BlankFragment中的跳转如下

        Button blank_but_jump = view.findViewById(R.id.blank_but_jump);

        blank_but_jump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                NavDirections action =
                        BlankFragmentDirections.actionBlankFragmentToCragment();
                Navigation.findNavController(v).navigate(action);
            }
        });

6.3 带参数的Safe Args导航
在导航图中给blankFragment添加参数argument。

    <fragment
        android:id="@+id/blankFragment"
        android:name="cn.jn.mytest.BlankFragment"
        android:label="fragment_blank"
        tools:layout="@layout/fragment_blank">

        <action
            android:id="@+id/action_blankFragment_to_cragment"
            app:destination="@id/cragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popExitAnim="@anim/slide_out_right">

            <argument
                android:name="testA"
                android:defaultValue="0"
                app:argType="integer" />
        </action>

    </fragment>

跳转+参数

  BlankFragmentDirections.ActionBlankFragmentToCragment actionBlankFragmentToCragment = BlankFragmentDirections.actionBlankFragmentToCragment();
                actionBlankFragmentToCragment.setTestA(1);
                Navigation.findNavController(v).navigate(actionBlankFragmentToCragment);

接收

        Bundle bundle = getArguments();
        if (bundle != null) {

            int testA = bundle.getInt("testA");
            Log.d("aaaaaa", testA + "");
        }
  1. 效果如下
    在这里插入图片描述

添加动画

动画文件自己创建
在这里插入图片描述

deeklink

通过pendingIntent,跳转到应用程序的某个页面。

  1. 通过通知跳转fragmment
    在导航图中添加了一个fragment,当做点击通知时的跳转页面。
<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/blankFragment">
   
   ......
   
    <fragment
        android:id="@+id/notifyFragment"
        android:name="cn.jn.mytest.NotiFragment"
        android:label="fragment_notify"
        tools:layout="@layout/fragment_notify" />
</navigation>

在BlankFragment,创建Notification。如果项目的targetSdk =33,则需要声明和动态申请android.permission.POST_NOTIFICATIONS的权限。

public class BlankFragment extends Fragment {


    private ActivityResultLauncher<String> activityResultLauncher;

    public BlankFragment() {
        // Required empty public constructor
    }

    public static BlankFragment newInstance(String param1, String param2) {
        BlankFragment fragment = new BlankFragment();
        return fragment;
    }


    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);

        activityResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallback<Boolean>() {
            @RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
            @Override
            public void onActivityResult(Boolean result) {

                if (result) {

                    Log.d("权限", "已授权");
                } else {

                    Log.d("权限", "未授权");
                }
            }
        });
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        Button blank_but_jump = view.findViewById(R.id.blank_but_jump);

        blank_but_jump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //系统版本大于等于33
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {

                    NotificationManager notificationManagerCompat = requireContext().getSystemService(NotificationManager.class);
                    //检测是否允许了权限
                    boolean b = notificationManagerCompat.areNotificationsEnabled();
                    if (!b) {
                        //请求权限
                        activityResultLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
                        return;
                    }
                }

                sendNotify();
            }
        });
    }


	/**
	*通知
	*/
    public void sendNotify() {

        NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(requireContext());

        //创建通知通道
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel("MyChannel", "MyChannel", NotificationManager.IMPORTANCE_LOW);
            notificationManagerCompat.createNotificationChannel(notificationChannel);
        }
		//要跳转的fragment
        PendingIntent pendingIntent = new NavDeepLinkBuilder(requireActivity())
                .setGraph(R.navigation.nav_graph)
                .setDestination(R.id.notifyFragment)
                .createPendingIntent();

        Notification notificationCompat = new NotificationCompat.Builder(requireActivity().getApplicationContext(), "MyChannel")
                .setContentTitle("123456")
                .setContentInfo("跳转")
                .setContentIntent(pendingIntent)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setAutoCancel(true)
                .build();

        notificationManagerCompat.notify(1, notificationCompat);
    }
}

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

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

相关文章

Java奠基】Java经典案例讲解

目录 卖飞机票 找质数 开发验证码 数组元素的复制 评委打分 数字加密 数字解密 抢红包 模拟双色球 二维数组 卖飞机票 需求&#xff1a;机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。按照如下规则计算机票价格&#xff1a; 旺季&…

ROS实践14 分布式通信

文章目录运行环境&#xff1a;思路&#xff1a;1.1 设置固定IP2.1 修改hosts文件3.1 检查是否成功通信4.1 修改bashrc5.1 演示运行环境&#xff1a; ubuntu20.04 noetic 宏基暗影骑士笔记本 思路&#xff1a; 主机启动roscore和乌龟速度订阅节点&#xff0c;从机启动乌龟键盘…

大模型时代下做科研的思路

总结zhu老师观点 Efficient 1.这篇论文是真的好orz&#xff0c;总结了目前的视频类模型 修改周边的一些参数&#xff0c;来训练&#xff0c;不改基础的模型&#xff08;太大了。。。没资源没卡&#xff09; 引申&#xff1a; prompt 是你想模型干什么你就给提示&#xff08…

python win环境 pip setuptools wheel安装

2023年。 今年的测试小学弟问我python这个安装怎么这么啥b。没有安装pip时 python setup.py install时需要setuptools&#xff0c;安装setuptools需要安装pip。 我看了看他的python是官网下的压缩包解压来的&#xff0c;内部非常干净。python-3.10.11 1. 安装pip 遇到这种情况…

“智慧赟”平台型经济引领行业新标杆

​  2021年&#xff0c;国家高度重视区块链行业发展&#xff0c;各部委发布的区块链相关政策已超60项&#xff0c;区块链不仅被写入“十四五”规划纲要中&#xff0c;各部门更是积极探索区块链发展方向&#xff0c;全方位推动区块链技术赋能各领域发展。在区块链产业具体内容…

【JavaEE】Spring中存储和获取Bean(使用注解)

目录 存储Bean 配置文件中设置扫描路径 使用注解存储Bean 五大类注解存储Bean 五大类注解之间的关系 为什么要有五大类注解 Bean方法注解存储方法返回值 注入Bean 属性注入 Setter方法注入 构造方法注入 Resource注解 存储Bean 上篇文章的存储Bean是在Spring的配置…

16.网络爬虫—字体反爬(实战演示)

网络爬虫—字体反爬一字体反爬原理二字体反爬模块FonttoolsTTF文件三FontCreator 14.0.0.2790FontCreatorPortable下载与安装四实战演示五后记前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新星…

一天吃透MySQL面试八股文

什么是MySQL MySQL是一个关系型数据库&#xff0c;它采用表的形式来存储数据。你可以理解成是Excel表格&#xff0c;既然是表的形式存储数据&#xff0c;就有表结构&#xff08;行和列&#xff09;。行代表每一行数据&#xff0c;列代表该行中的每个值。列上的值是有数据类型的…

python调用matlab源码函数

Background 关于在python中调用matlab函数&#xff0c;我之前已经写过两篇文章了&#xff0c;非常详细&#xff0c;且之前的方法可以不用安装matlab程序&#xff0c;只需要按照mcr运行环境就行了。具体可以参考&#xff1a;【java和python调用matlab程序详细记录】【Python 高效…

一文解析为什么进程地址空间中包括操作系统?

今天聊聊进程地址空间这点小事。说到进程的地址空间&#xff0c;大家可能都知道这样一张图&#xff1a; 这张图就是Linux程序运行起来后所谓的进程地址空间&#xff0c;这里包括我们熟悉的代码区、数据区、以及堆区和栈区&#xff0c;今天我们不讲解这些区域&#xff0c;而是重…

elementui的el-message重复点击,提示会一直叠加

1.问题&#xff1a; elementui的el-message连续点击按钮会出现一排提示&#xff0c;注意体验很不友好&#xff0c;而且也不好看 如下&#xff1a; 这种问题如何解决呢 ? 2.参考api elementui的官网有这个api&#xff0c;也就是说通过close这个方法可以解决 3.附上代码&a…

设计模式之美-结构型模式-装饰器模式

装饰器模式主要解决继承关系过于复杂的问题&#xff0c;通过组合来替代继承。指在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式&#xff0c;装饰器模式提供了比继承更有弹性的替代方案将功能附加到对象上…

4月20日专家谈:内网突遭攻击,安全人员一招有效处理

随着网络威胁的愈加频繁&#xff0c;企业面临的安全问题也越来越多&#xff0c;传统的安全能力在面对日益增长的安全问题时显得捉襟见肘。 SOAR借助安全编排和自动化技术&#xff0c;将人工操作和技术集成在一起&#xff0c;自动化完成安全处置&#xff0c;帮助企业更快地响应…

JavaScript【九】JavaScript BOM(浏览器对象模型)

文章目录&#x1f31f;前言&#x1f31f; Bom&#xff08;浏览器对象模型&#xff09;&#x1f31f;window对象&#xff1a;&#x1f31f;属性&#xff1a;&#x1f31f; 方法&#xff1a;&#x1f31f; 获取元素:&#x1f31f; 添加点击事件&#xff1a;&#x1f31f; 获取表单…

大数据Flink进阶(二十):Flink细粒度资源管理

文章目录 Flink细粒度资源管理 一、细粒度资源管理介绍 二、细粒度资源适用场景

关于合金电阻

合金电阻是一种具有高精度、高稳定性和高温度特性的电阻器件&#xff0c;广泛应用于各种电子设备中。选型合适的合金电阻并进行合理的设计&#xff0c;可以有效地提高电路的性能和可靠性。本文将从合金电阻的基本原理、选型方法及设计要点等方面进行详细介绍。 一、合金电阻的基…

简单认识下with和上下文管理器

with 对于系统资源如文件、数据库连接、socket&#xff0c;应用程序打开这些资源并执行完业务逻辑之后&#xff0c;必须关闭&#xff08;断开&#xff09;该资源。系统允许打开的最大文件数量是有限的&#xff0c;如果我们打开文件后没有及时关闭&#xff0c;极端情况下会出现…

21天学会C++:Day2----命名空间的那些事儿

CSDN的uu们&#xff0c;大家好。这里是C入门的第二讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 为什么要有命名空间 2. 命名空间的定义 3. 访问命名空间域中成员的三种方…

基于Java+SpringBoot+vue的人职匹配推荐系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;300套&#xff09; 目录 一、效果演示 二、…

virtualbox如何配网

配网搞了一天&#xff01;&#xff01;&#xff01; 百度到的所有教程都是垃圾&#xff01;&#xff01; 就没有一个写全的&#xff01;&#xff01;写明白怎么配的&#xff01;&#xff01;&#xff01; 我自己来&#xff01;&#xff01;&#xff01;不会配的看我&#xf…