Android Jetpack 应用指南 - Navigation

news2024/12/22 20:10:49

前言

在Android开发的过去几年中,在公司的项目中一直没有机会尝试单Activity多Fragment的开发模式,随着Google推出Navigation组件,我意识到,终于有机会学习一种全新的开发模式了。

与上一篇文章相同,本篇同样是Navigation的初探,会用尽可能简洁的方式来了解Navigation,让我们对Navigation有一个初步印象,不会长篇大论或者源码轰炸,导致干货太多引起阅读困难。

目录

  • Navigation简介
  • Navigation的组成
  • Navigation实践

正文

Navigation简介

Navigation又称导航组件,主要负责应用内导航,也就是我们常说的屏幕切换。应用导航是Android开发中很重要的一部分,过去我们一般通过Intent或Fragment事物来实现应用内导航,使用场景也比较简单,点击按钮切换屏幕即可。

但是当场景变得复杂后,导航的管理就会便得十分困难。比如App首页常见的底部导航模式,不仅要确保用户在点击底部导航栏后,应用界面可以正常跳转,而且还需要突出显示正确的按钮,在处理返回栈的时候,也同样需要注意这个问题。而新的导航组件,就可以出色的解决这类复杂的问题。

通过引入navigation,我们可以轻松地使用navigation完成以下工作:

  • 简化常见导航模式的设置工作
  • 管理返回栈
  • 自动处理fragment事务
  • 简化类型安全参数传递
  • 管理转场动画
  • 轻松设置深度链接

同时navgation中引入了一种全新的资源文件,还可以集中种存储并可视化导航信息,极大程度地方便了开发人员对于屏幕切换的管理。

Navigation的组成

一个完整的Navigation由导航图、导航容器、导航控制器三个部分组成,下面分别来讲解这三个部分:

  • 导航图

    是一个新增的资源类型,它是一个XML文件,用于集中保存所有导航相关的信息,在Android Studio 3.3中提供了新的导航编辑器,能够可视化这些信息。在开发中,我们可以把它当作一款创建视图的图片编辑器。

在导航图中,一个屏幕代表一个destination(目的地),也就是导航指向的下一个视图,单Activity的开发中,可以利用Fragment来创建destination。
选中一个destionation后,我们可以定义深层链接URL和启动选项等等

导航图中的箭头叫做action,代表您可以在应用中使用的几条导航路径,选中其中一个action后,我们就能看到一组内嵌信息,包括各个destionation间传递的信息、转场动画、返回栈操作等

  • 导航容器

    导航容器是一个name为NavHostFragment的fragment布局,它的本质就是一个导航界面的容器,用来动态替换应用中各个destionnation所代表的fragment。我们需要在布局中添加这个Fragment widget,如图所示:

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

 

  • 导航图支持在Android studio3.3中进行可视化操作,在使用navigation时,建议将Android studio升级到3.3及以上的版本。

  • 导航控制器

    导航控制器用于设定导航组件行为与方向的组件,我们需要在java或者kotlin代码中为每一个NavHostFragment添加对应的NavController,以便管理和控制具体的导航行为。

Navigation.findNavController(it).navigate(R.id.navi2Fragment)
  • 通过添加 navController.navigate(R.id.xxx),navcontroller就会根据导航图中的信息来执行相应的导航操作,并最终把需要显示的fragment切换到NavHostFragment中。

Navigation实践

简单介绍了Navigation的组成后,我们通过完成一个底部导航,来继续深入了解Navigation的使用。

1.引入Navigation依赖

根据项目使用的语言,在module的build.gradle中添加对于语言的依赖

dependencies {
  def nav_version = "2.0.0"
  def nav_version_ktx = "2.0.0"

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

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

}

 

2.创建导航图

在res文件夹下新建一个名为navigation的资源文件夹

然后在navigation中新建导航图,名称任意,这里使用module的名称加一个graph后缀

 

3.创建导航容器

新建一个Activity用于管理fragment,同时创建对应的布局文件,activity布局文件中包含一个导航容器fragemnt,和一个底部BottomNavigationView。

<?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">

    <fragment
        android:id="@+id/content"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/aac_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="0dp"
        android:layout_height="55dp"
        android:background="@android:color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/main_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>

 activity中将工作托管给具体的NavController,它可以确保返回栈中的所有导航工作都遵循MD最佳实践

class NavigationActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_navigation)

        val host: NavHostFragment = supportFragmentManager!!.findFragmentById(R.id.content) as NavHostFragment?
                ?: return
        val navController = host.navController

        val bottomNav = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
        bottomNav?.setupWithNavController(navController)
    }
}

4.新建fragment选项卡,修改导航图

新建四个fragment,具体的内容可以任意,只是用作选项卡。

然后打开导航图,将新增的4个fragment选项卡添加进入导航图中 

到此为止,一个底部导航可以动态切换的首页就完成了,是不是比我们平常使用fragment事务的写法要简单很多? 

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

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

相关文章

Lenovo IdeaPad S540-14IML 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo IdeaPad S540-14IML 2019 (Type 81NF) 处理器Intel Core i5-10210U / i7-10510U已驱动 内存Internal 4GB 2666 Changeable 8GB 2666 memo…

Android进程间通信

在操作系统中&#xff0c;每个进程都有一块独立的内存空间。为了保证程序的的安全性&#xff0c;操作系统都会有一套严格的安全机制来禁止进程间的非法访问&#xff0c;但是&#xff0c;很多情况下进程间也是需要相互通信的 进程间通信&#xff08;Inter-process communication…

嵌入式学习笔记——SPI通信的应用

SPI通信的应用 前言屏幕分类1.3OLED概述驱动芯片框图原理图通信时序显示的方式页地址、列地址初始化指令 程序设计初始化代码初始化写数据与写命令清屏函数 初始化代码字符显示函数 总结 前言 上一篇中介绍了STM32的SPI通信&#xff0c;并根据框图和寄存器进行了SPI通信的初始…

轻松掌握k8s(使用docker)安装知识点

1、介绍 kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c; Kubernetes 可以负载均衡并分配网络流量&#xff0c;从而使部署稳定。存储编排 Kubernetes 允许你自…

【数据库】— 无损连接、Chase算法、保持函数依赖

【数据库】— 无损连接、Chase算法 Chase算法Chase算法举例一种简便方法&#xff1a;分解为两个模式时无损连接和函数依赖的一个简单例子 Chase算法 形式化定义&#xff1a; 构造一个 k k k行 n n n列的表格&#xff0c;每行对应一个模式 R i ( 1 ≤ i ≤ k ) Ri (1≤i ≤ k)…

计算机组成原理汇总

提示&#xff1a;日落归山海&#xff0c;山海藏深情 文章目录 1.1 计算机的发展1.2 计算机硬件的基本组成1.3 计算机的性能指标2.1.1 进位计数制2.1.2 BCD码2.1.3 无符号整数的表示和运算2.1.4 带符号整数的表示和运算(原反补)2.1.5原反补码的特性对比2.1.6 移码2.1.7 定点小数…

【逗老师的无线电】骚活,GPS热点盒子自动上报APRS位置

逗老师最近整了个有意思的小活&#xff0c;组装了一个有4G网卡带GPS功能的热点盒子&#xff0c;让盒子基于GPS位置信息&#xff0c;自动上报APRS位置帧 全篇亮点 基于GPS和AGPS共同定位基于TCP直接上报APRS数据帧 别说&#xff0c;这小活整完之后&#xff0c;还是有点意思的&…

linux coredump

文章目录 是什么生成原理coredump 的“危害” reference: 一文读懂Coredump文件是如何生成的 GDB是什么&#xff1f; 是什么 简单的讲&#xff1a;当进程接收到某些信号而导致异常退出时&#xff0c;就会生成 coredump 文件 在程序发生某些错误而导致进程异常退出时&#x…

技术分析内核并发消杀器(KCSAN)一文解决!

一、KCSAN介绍 KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器&#xff0c;它依赖于编译时插装&#xff0c;并使用基于观察点的采样方法来检测竞态&#xff0c;其主要目的是检测数据竞争。 KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race…

亿发软件:中大型仓库进出货管理系统解决方案,定制软件让仓储作业高效便捷

中大型仓库出入库管理是传统厂家供应链管理流程的重要部分&#xff0c;直接关乎货物在仓库当中存储的安全&#xff0c;和员工工作的效率。一旦仓库管理当中出现了疏漏&#xff0c;那么货物的信息数据就会发生变动&#xff0c;导致实际与账目不符。人工带来的低效与不可控是传统…

软件测试行业到底有没有前景和出路?

我现在来跟你说说软件测试的真正情况。 首先一个软件做出来&#xff0c;最不能少的人是谁&#xff1f;不用说就是开发&#xff0c;因为开发是最了解软件运作的那个人&#xff0c;早期不少一人撸网站或者APP的例子&#xff0c;相当于一个人同时是产品、研发、测试、运维等等&am…

15-721 Chapter9 数据压缩

Background disk database的瓶颈在disk IO上的话&#xff08;也就是说数据压缩的好处很大&#xff0c;可以比较放心的做&#xff09;&#xff0c;那么内存数据库的瓶颈是多方面的&#xff0c;其中包含cpu。所以我们要在计算量和压缩率&#xff08;DRAM还是有点贵的&#xff0c…

需求管理实践四大流程的注意事项

需求管理实践包括四大流程&#xff1a;需求采集、需求分析、需求筛选和需求处理。 1、需求采集注意事项 需求采集需要通过多种形式对不同用户需求进行收集&#xff0c;并对需求的属性进行详细记录&#xff0c;并记录可追溯的反馈人员&#xff0c;以便后期跟踪修改。 需求管理实…

你不知道的Redis Search 以及安装指南

theme: orange 本文正在参加「金石计划」 这篇文章是为了使用Redis Search 的向量搜索功能提前做的环境准备工作。即讨论如何在准备生产的 linux 环境中安装 RediSearch 和 RedisJSON 模块。 什么是RediSearch&#xff1f; 根据RediSearch的官方文档 RediSearch是这样描述的。 …

线性表,栈和队列(2)

作者&#xff1a;额~我那个早过50了&#xff0c;忘记了 言归正传ca 什么是栈&#xff1f; 小李攒钱买了车&#xff0c;可是他家住在胡同的尽头。胡同很窄&#xff0c;只能通过一辆车&#xff0c;而且是死胡同。小李每天都为停车发愁&#xff0c;如果回家早了停在里面&#x…

pandas笔记:pandas 排序 (sort_values)

1 函数说明 DataFrame.sort_values(by,*, axis0, ascendingTrue, inplaceFalse, kindquicksort, na_positionlast, ignore_indexFalse, keyNone) 2 参数说明 by string或者一组string组成的list&#xff0c;根据什么进行排序 axis{0 or ‘index’, 1 or ‘columns’}ascendi…

其它 Composition API

1.shallowReactive 与 shallowRef shallow有浅的意思 首先在原有的页面上引入它&#xff0c;然后用shallowReactive包裹它 浅层次的意思就是像name&#xff0c;age这些是响应式的&#xff0c;而job就不处理&#xff0c;意思就是只处理第一层数据&#xff0c;像第二层的都不处理…

电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 程序链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》&#xff0c;文献模型提供了一个很好的创新思路&#xff0c;把常规电气互联系统的调度和有功无功优化…

【Linux】-关于Linux的指令(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; TOC 前言 今天我们来讲关于Linux的基本指令&#xff0c;博主讲的指令会对应着Windows…

Java 8中新特性Stream的详细理解和使用

Java 8中新特性Stream的基本理解和使用 Stream基本概念 Stream流是来自数据源的元素队列并支持聚合操作 **元素&#xff1a;**是特定类型的对象&#xff0c;是数据源形成的一个队列。Java中Stream不会存储元素&#xff0c;而是按需计算 数据源&#xff1a;Stream流数据的来…