Android Navigation基本使用

news2024/9/9 4:45:53

目录

  • 1. Navigation概述
  • 2. Navigation组成
  • 3. 设置环境
  • 4. 使用方法
    • 4.1. 创建导航图
      • 4.1.1. 具体操作
    • 4.2. 向Activity添加NavHost
      • 4.2.1. 通过 XML 添加
      • 4.2.2. 使用布局编辑器添加
    • 4.3. 在导航图中创建目的地
      • 4.3.1. 具体操作
    • 4.4. 连接目的地
      • 4.4.1. 具体操作
    • 4.5. 目的地之间的导航
      • 4.5.1. 具体操作
    • 4.6. Navigation的返回
      • 4.6.1. 具体操作
    • 4.7. 在目的地间传递数据
      • 4.7.1. 定义目的地参数
      • 4.7.2. 使用Bundle实现数据传递
  • 5. 结果示例

1. Navigation概述

Navigation是指支持用户导航、进入和退出应用中不同内容片段的交互。用于处理 Fragment事务,使fragment之间可以自由切换和跳转,同时还包括导航界面模式(例如抽屉式导航栏和底部导航),可以降低用户工作量

2. Navigation组成

  • 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。包含用户可以跳转的所有路径,对Navigation来说就像是地图。
  • NavHost:用来显示导航图中目标所要展示的内容。
  • NavController:在 NavHost 中管理应用导航的对象。负责NavHost里内容的改变

如果要在应用中导航,则通过NavController,沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController 就可以在NavHost里进行跳转。

3. 设置环境

在Module的build.gradle下添加如下依赖,再进行同步,完成环境设置

    dependencies {
    // 指定Navigation的版本
      def nav_version = "2.5.3"

      // Java language implementation
      implementation "androidx.navigation:navigation-fragment:$nav_version"
      implementation "androidx.navigation:navigation-ui:$nav_version"

      // Kotlin
      implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
      implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

      // Feature module Support
      implementation "androidx. navigation:navigation-dynamic-features-fragment:$nav_version"

      // Testing Navigation
      androidTestImplementation "androidx.  navigation:navigation-testing:$nav_version"

      // Jetpack Compose Integration
      implementation "androidx.navigation:navigation-compose:$nav_version"
    }

4. 使用方法

4.1. 创建导航图

导航图是一种资源文件,其中包含Navigation所有目的地和操作。会显示应用的所有导航路径。

4.1.1. 具体操作

  1. 在“Project”窗口中,点击 res 目录,然后依次选择 New > Android Resource File。此时系统会显示 New Resource File 对话框。
  2. 在 File name 字段中输入Navigation的名称,例如“graph”。
  3. 从 Resource type 下拉列表中选择 Navigation,然后点击 OK。

这样就完成了空白导航图的创建,这时来到res文档下就会看到navigation文件夹还有你创建的导航图
res

4.2. 向Activity添加NavHost

分成两种方法:

  1. 通过 XML 添加
  2. 使用布局编辑器添加

4.2.1. 通过 XML 添加

在activity中加入如下代码

<!-- 这里navGraph的值要改为自己导航图的名字 -->
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="409dp"
        android:layout_height="729dp"
        app:defaultNavHost="true"
        app:navGraph="@navigation/graph"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp" />

4.2.2. 使用布局编辑器添加

  1. 在项目文件列表中,双击 Activity 的布局 XML 文件,以在 Layout Editor 中将其打开。
  2. 点击右上角的design,在Palette界面内,选择Containers类别,找到“NavHostFragment”,然后将 NavHostFragment 视图拖动到对应的 Activity 上。
    2
  3. 接下来,会弹出如下对话框,双击自己要使用的导航图,这里是graph
    3

4.3. 在导航图中创建目的地

目的地相当于是导航图中的一个个地点,展示各种界面内容

4.3.1. 具体操作

  1. 双击导航图,点击右上角的Design,来到下图的 Navigation Editor 界面,点击图中标红图标,然后点击 Create new destination。
    4
  2. 在接下来的对话框中,创建 Fragment,Android Studio会按照如下配置创建BlankFragment类和fragment_layout布局(fragment_layout中默认采用FrameLayout的布局,可以改成ConstraintLayout)
    5

回到 Navigation Editor 界面就可以看到导航图中已经有了一个目的地

6

4.4. 连接目的地

操作会将一个目的地连接到另一个目的地,即一个界面是否可以跳转到另一个界面

为了演示,我在上面的基础上再建了一个BlankFragment2

4.4.1. 具体操作

选中目的地后将该目的地右方的圆圈拖到另一个目的地,松开鼠标后两个目的地以箭头连接,如下图所示
7

4.5. 目的地之间的导航

为了演示,我在blankFragment里增添了一个按钮用来跳转至blankFragment2

4.5.1. 具体操作

  1. 在系统生成的BlankFragment类里的onCreateView方法里进行改动
  2. 通过 Navigation.findNavController(view) 方法得到对应 NavController
  3. 使用 NavController 里的 navigate(int) 方法进行导航,该方法的参数为两目的地之间连接的id或者要导向的目的地id
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_blank, container, false);
        View button = view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              // action_blankFragment_to_blankFragment22为两目的地之间连接的id或者要导航向的目的地id
                Navigation.findNavController(view).navigate(R.id.action_blankFragment_to_blankFragment22);
            }
        });
        // Inflate the layout for this fragment
        return view;
    }

4.6. Navigation的返回

Navigation支持多个返回堆栈可让用户在各个页面之间自由切换,同时不会在任何页面中丢失所处的位置,不需要导航图中有对应的连接就可以进行返回操作

为了演示,我在blankFragment2里增添一个返回按钮

4.6.1. 具体操作

  1. 在系统生成的BlankFragment类里的onCreateView方法里进行改动
  2. 通过 Navigation.findNavController(view) 方法得到对应 NavController
  3. 使用 NavController 里的 popBackStack() 方法即可完成返回
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_blank2, container, false);
        Button button2 = view.findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //返回
                Navigation.findNavController(view).popBackStack();
            }
        });
        // Inflate the layout for this fragment
        return view;
    }

4.7. 在目的地间传递数据

Navigation 支持通过定义目的地参数将数据附加到导航操作,实现数据在两个fragment间的传输。

为了演示,我在前面的blankFragment和blankFragment2中分别加上EditText和TextView,用来实现传递数据和接收数据

4.7.1. 定义目的地参数

  1. 在 Navigation Editor 界面中,点击选择接收参数的目的地,这里是blankFragment2
  2. 在右侧的 Attributes 面板中,点击 Add (+)。
  3. 在显示的 Add Argument Link 窗口中,输入参数名称、参数类型、参数是否可为 null,以及默认值(如果需要)。
  4. 点击 Add。请注意,该参数现在会显示在 Attributes 面板的 Arguments 列表中。

查看code该参数已添加到 XML 中。点击 Text 标签页以切换到 XML 视图,就会发现参数已添加到接收该参数的目的地。
如下图所示,我所设置的参数名称为textString,参数类型为string

    <fragment
        android:id="@+id/blankFragment2"
        android:name="com.example.myapplication.BlankFragment2"
        android:label="fragment_blank2"
        tools:layout="@layout/fragment_blank2" >
        <argument
            android:name="textString"
            app:argType="string" />
    </fragment>

4.7.2. 使用Bundle实现数据传递

  1. 发送方创建 Bundle 对象,将数据放入入 Bundle 对象后,通过 NavController 中的 navigate() 方法传给发送方
        EditText editText = view.findViewById(R.id.editText);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String textString = String.valueOf(editText.getText());
                Bundle bundle=new Bundle();
                bundle.putString("textString", textString);
                Navigation.findNavController(view).navigate(R.id.action_blankFragment_to_blankFragment22,bundle);
            }
        });
  1. 接收方通过 getArguments() 方法得到 Bundle 对象并可以使用里面的内容
        TextView textView = view.findViewById(R.id.textView1);
        textView.setText(getArguments().getString("textString"));

这样就可以实现在blankFragment里输入数据传送到blankFragment2里

5. 结果示例

blankFragment 输入效果

8
blankFragment2 输出效果

9

原作者:林冠圳

原文链接:原文链接

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

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

相关文章

认识3dmax 对象属性对话框

可以从右键或编辑菜单访问此对话框&#xff1b; 在此可以查看和编辑参数&#xff0c;以确定选定对象在视口和渲染过程中的行为&#xff1b; 包含3个面板&#xff1a;常规&#xff0c;高级照明&#xff0c;用户定义&#xff1b; 常规面板包含6个组&#xff1a;对象信息&#x…

[附源码]计算机毕业设计校园疫情管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

三、Git本地仓库基本操作——git仓库忽略跟踪文件

1. .gitignore文件 在工作区中的文件内容&#xff0c;很多时候我们基本只关注源文件。所以&#xff0c;肯定有些文件是不想使用git去管理的&#xff0c;比如&#xff1a; 编译生成的中间文件相关的IDE工程文件&#xff08;当然也可以进行git管理&#xff09;一些固定内容的说…

国外打工人分享如何如何通过销售excel电子表格赚到 28 万美元

在不到 2 年的时间里,这是我在 Etsy 上销售电子表格模板(Google 表格 + Excel)的收入。 而且我无论如何都不是电子表格专家。 但我确实知道如何找到有需求的数字产品,并且会帮助人们在通常需要更长时间才能完成的事情上节省时间。 我还没有看到很多人谈论这个,所以我想…

【图像分类损失】Encouraging Loss:一个反直觉的分类损失

论文题目&#xff1a;《Well-classified Examples are Underestimated in Classification with Deep Neural Networks》 论文地址&#xff1a;https://arxiv.org/pdf/2110.06537.pdf 1.背景 深度分类模型背后的一般常识是专注于分类错误的样本&#xff0c;而忽略远离决策边界的…

Studio 3T工具下载安装及使用教程

一、下载安装 官方网址&#xff1a;The Professional Client, IDE and GUI for MongoDB | Studio 3T 二、使用教程 CRUD操作&#xff1a; 打开命令行窗口&#xff0c;Open intelliShell 插入一个文档&#xff0c;db.collection.insertOne() 插入多个文档&#xff0c;db.coll…

[附源码]计算机毕业设计springboot中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

PS画布基本操作 新建保存 图片类型区分设置

观看本文需要您的电脑装配有ps软件 如果没有 可以查看我的文章 PS软件下载安装以基本配置 然后我们打开ps软件 然后点击右上角 文件 然后选择 新建 然后可以配置一下 右边的话 我们可以设置 高度 和 宽度 都是数值 其次是要指定你这个数值的单位 一般情况下 都会用像素 一…

Vue(第十五课)Pinia组件库的基本知识

为什么要使用 Pinia&#xff1f; Pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。 如果您熟悉 Composition API&#xff0c;您可能会认为您已经可以通过一个简单的 export const state reactive({}). 这对于单页应用程序来说是正确的&#xff0c;但如果它是…

jsp人力资源管理系统Myeclipse开发mysql数据库servlet开发java编程计算机网页项目

一、源码特点 JSP 人力资源管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

用户信息列表实现增删改查案例的实现【问题及解决过程记录】【综合案例】

目录 用户信息列表展示案例 1. 需求&#xff1a; 1. 简单功能 1. 列表查询 2. 登录 3. 添加 4. 删除 5. 修改 2. 复杂功能 1. 删除选中 2. 分页查询 * 好处&#xff1a; 1. 减轻服务器内存的开销 …

【云原生 | Kubernetes 实战】06、Pod高级实战:基于污点、容忍度、亲和性的多种调度策略(下)

目录 一、Pod节点亲和性 1.1 案例演示&#xff1a;pod 节点亲和性——podAffinity 1.2 案例演示&#xff1a;pod 节点反亲和性——podAntiAffinity 1.3 案例演示&#xff1a; 换一个 topologykey 值 二、污点和容忍度 2.1 案例演示&#xff1a; 把 node2 当成是生产环境专…

Python中常见的调色板: 颜色 color

Python中常见的调色板&#xff1a; 颜色 color 这个人对颜色的总结&#xff0c;非常到位哈&#xff01; https://blog.csdn.net/weixin_42943114/article/details/81811556

SPI 机制详解

SPI 全称为 Service Provider Interface &#xff0c;它是一种服务发现机制。它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件&#xff0c;自动加载文件里所定义的类。这一机制为很多框架拓展提供了可能&#xff0c;比如在Dubbo&#xff0c;JDBC中都使用到了SPI…

go return返回值屏蔽

前言 最近需要写一个云环境的可执行程序&#xff0c;一般使用go语言&#xff0c;毕竟GC原生运行&#xff0c;结合了不需要回收指针的能力和原生运行&#xff0c;但是在程序返回时&#xff0c;笔者看到一个sdk的源码懵了&#xff0c;返回的数据居然可以隐式返回。 准备 go 版本…

机器学习8线性回归法Linear Regression

文章目录一、线性回归算法简介典型的最小二乘法的问题目标&#xff1a;具体怎么推此处省略二、简单线性回归的实现三、向量化运算一、线性回归算法简介 1.解决回归问题&#xff1b; 2.思想简单&#xff0c;实现容易&#xff1b; 3.是许多强大的非线性模型的基础&#xff1b; 4…

ESP32——WEB服务程序测试(基于官方示例restful_server)

一、简介 基于官方示例restful_server创建一个新工程。 参考1&#xff1a; 官方说明 参考2&#xff1a; ES32 RESTful_server实验_NULL_1969的博客-CSDN博客 二、编译下载运行工程 直接编译运行&#xff0c;出现下面两个错误。 2.1 OCD调试错误 esp_semihost: OpenOCD i…

文本生成客观评价指标总结(附Pytorch代码实现)

前言&#xff1a;最近在做文本生成的工作&#xff0c;调研发现针对不同的文本生成场景&#xff08;机器翻译、对话生成、图像描述、data-to-text 等&#xff09;&#xff0c;客观评价指标也不尽相同。虽然网络上已经有很多关于文本生成评价指标的文章&#xff0c;本博客也是基于…

[附源码]JAVA毕业设计计算机组成原理教学演示软件(系统+LW)

[附源码]JAVA毕业设计计算机组成原理教学演示软件&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

PCB元件创建

目录 一&#xff1a;创建元件基本流程 1.1.创建一个原理图库 1. 2.创建元件 1.3绘制 1.4放置管脚 二&#xff1a; 元件创建 2.1电容类元件创建 2.2.电感类元件 2.3.电阻类元件 2.4LED元件 2.5按键元件 2.6芯片类元件创建 2.6.1修改栅格颜色 2.6.2阵列粘贴 2.7接插…