AndroidCompose Navigation导航精通1-基本页面导航与ViewPager

文章目录

    • 前言
    • 基本页面导航
      • 库依赖
      • 导航核心部件
      • 简单NavHost实现
    • ViewPager
      • Pager切换逻辑图阐述
      • Pager导航实战

前言

在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更简洁、更高效的导航实现方式。本系列教程将深入探讨如何在 Android Compose 中实现各种导航功能,从基础的页面跳转到复杂的导航架构设计,帮助你全面掌握 Compose Navigation 的精髓。

在本系列的第一部分,我们将聚焦于普通页面导航的基础知识。通过实际的代码示例,你将学会如何在 Compose 中设置导航图,定义导航目标,并实现页面之间的跳转。

此文章最终将会带您实现以下结果:
在这里插入图片描述

如果在此之前您有相关代码基础,可以直接浏览已经编写好的源码:
NavigationDemo 源码仓库


基本页面导航

库依赖

请将当前的库添加到build.gradle.kts内,这个是模块的gradle,不是项目的gradle
在这里插入图片描述

// Navigation
implementation("androidx.navigation:navigation-compose:2.8.2")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1")
// Icons
implementation("androidx.compose.material:material-icons-extended:1.7.3")

导航核心部件

在 Android Compose 中,导航是通过 Navigation 库来实现的,它提供了一种声明式的方式来管理页面跳转和页面栈。

Navigation库所包含的核心部件
● NavController:导航控制器,负责管理导航图(NavGraph)和导航栈。它提供了 navigate 方法来跳转到不同的页面,以及 popBackStack 方法来返回上一个页面。
● NavGraph:导航图,定义了应用中的所有导航目标(页面)和它们之间的关系。导航图可以通过 NavHost 来构建。
● NavHost:导航宿主,是一个 Composable 函数,用于构建导航图并显示当前页面。它接受一个 NavController 和一个 startDestination 参数,定义了导航的起点。
● NavDestination:导航目标,表示导航图中的一个页面。在 Compose 中,导航目标通常是一个 Composable 函数。

简单NavHost实现

下面给出了一个基本的NavHost实现方式;
您仅需在MainActivity界面调用此MyApp界面即可,这样整个页面都充满了NavHost,当我们切换路由时,NavHost就会渲染当前路由指向页面,这样子就实现了基本的路由导航功能

@Composable
fun MyApp(navController: NavHostController) {NavHost(navController = navController, startDestination = "home") {composable("home") { HomeScreen(navController) }composable("detail") { DetailScreen(navController) }}
}

ViewPager

在Compose1.2.0及以上的库内已经默认植入了该组件库,您可以直接使用;
目前最新版本AndroidStudio生成的material3模板已经植入了该库,无需再次导入任何外部库

众所周知,常见的应用会有一个底部导航栏,通过点击不同的导航按钮从而实现界面的切换,这种场景虽然也类似于路由的切换,但是实际上Navigation库并不参与进去,这里的界面切换实际上仍然是在同一个路由内进行的,只不过由ViewPager库来实现页面滑动渲染的过程而已;
我们引出以下两个术语:

  1. 一级导航页面:即使用底部导航栏切换页面
  2. 二级及以上导航页面:非一级导航的其他页面,这些页面打开后将完全覆盖一级导航
    请注意,使用HorizontalPager时,页面切换后不会保留原页面的状态,除非你使用ViewModel进行状态管理

Pager切换逻辑图阐述

如果上述文字描述不够清晰的话,您可以参考下面的逻辑图
undefined 最外层是NavHost,用于主管所有的路由导航,当前所在的路由是 main
undefined NavHost里层是一个Scaffold视图,这里content就是一个HorizontalPager,还有一个底部导航栏
所以不难得出运行机制如下:

  1. 当使用底部导航栏导航时,此时的路由一直处在main下,不会发生任何变化
  2. 当点击底部导航栏任意一个按钮时,使得pager发生动态变化
  3. pager变化触发HorizontalPager组件发生UI更新,将切换至对应数值所指向的页面
    在这里插入图片描述
<

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

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

相关文章

noteboolm 使用笔记

今天心血来潮&#xff0c;想要体验下AInotebook&#xff0c;看看最新的软件能够做到什么程度。 于是来到了notebooklm&#xff0c;这是一个google推出的AI笔记本的网站&#xff0c;我想知道我们能在上面做一些怎么样有趣的事情&#xff01; 网址&#xff1a;https://notebookl…

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…

ReactNative react-devtools 夜神模拟器连调

目录 一、安装react-devtools 二、在package.json中配置启动项 三、联动 一、安装react-devtools yarn add react-devtools5.3.1 -D 这里选择5.3.1版本&#xff0c;因为高版本可能与夜神模拟器无法联动&#xff0c;导致部分功能无法正常使用。 二、在package.json中配置启…

关于使用Mybatis-plus的TableNameHandler动态表名处理器实现分表业务的详细介绍

引言 随着互联网应用的快速发展&#xff0c;数据量呈爆炸式增长。传统的单表设计在面对海量数据时显得力不从心&#xff0c;容易出现性能瓶颈、查询效率低下等问题。为了提高数据库的扩展性和响应速度&#xff0c;分表&#xff08;Sharding&#xff09;成为了一种常见的解决方案…

【开源免费】基于Vue和SpringBoot的在线文档管理系统(附论文)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

智慧园区系统分类及其在提升企业管理效率中的创新应用探讨

内容概要 智慧园区的概念已经逐渐深入人心&#xff0c;成为现代城市发展中不可或缺的一部分。随着信息技术的飞速发展和数字化转型的不断推进&#xff0c;一系列智慧园区管理系统应运而生。这些系统不仅帮助企业提高了管理效率&#xff0c;还在多个方面激发了创新。 首先&…

图片上传实现图片预览的功能

文章目录 图片上传实现图片预览的功能一、引言二、拖拽上传实现预览1、HTML结构与样式2、JavaScript实现拖拽逻辑 三、选择文件上传实现预览1、HTML结构2、JavaScript实现预览逻辑 四、使用示例五、总结 图片上传实现图片预览的功能 一、引言 在现代网页设计中&#xff0c;图片…

电力晶体管(GTR)全控性器件

电力晶体管&#xff08;Giant Transistor&#xff0c;GTR&#xff09;是一种全控性器件&#xff0c;以下是关于它的详细介绍&#xff1a;&#xff08;模电普通晶体管三极管进行对比学习&#xff09; 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管&#xff08;BJT&am…

Linux - 进程间通信(2)

目录 2、进程池 1&#xff09;理解进程池 2&#xff09;进程池的实现 整体框架&#xff1a; a. 加载任务 b. 先描述&#xff0c;再组织 I. 先描述 II. 再组织 c. 创建信道和子进程 d. 通过channel控制子进程 e. 回收管道和子进程 问题1&#xff1a; 解答1&#xff…

【阅读笔记】New Edge Diected Interpolation,NEDI算法,待续

一、概述 由Li等提出的新的边缘指导插值(New Edge—Di-ected Interpolation&#xff0c;NEDI)算法是一种具有良好边缘保持效果的新算法&#xff0c;它利用低分辨率图像与高分辨率图像的局部协方差问的几何对偶性来对高分辨率图像进行自适应插值。 2001年Xin Li和M.T. Orchard…

Windows安装Miniconda和PySide6以及配置PyCharm

目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda&#xff0c;是因为它是一个更小的Anaconda发行版&#x…

Linux之内存管理前世今生(一)

一个程序&#xff08;如王者荣耀&#xff09;平常是存储在硬盘上的&#xff0c;运行时才把这个程序载入内存&#xff0c;CPU才能执行。 问题&#xff1a; 这个程序载入内存的哪个位置呢&#xff1f;载入内核所在的空间吗&#xff1f;系统直接挂了。 一、虚拟内存 1.1 内存分…

Java基于SSM框架的互助学习平台小程序【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

【Rust自学】16.3. 共享状态的并发

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 16.3.1. 使用共享来实现并发 还记得Go语言有一句名言是这么说的&#xff1a;Do not commun…

Python 数据分析 - Matplotlib 绘图

Python 数据分析 - Matplotlib 绘图 简介绘图折线图单线多线子图 散点图直方图条形图纵置横置多条 饼图 简介 Matplotlib 是 Python 提供的一个绘图库&#xff0c;通过该库我们可以很容易的绘制出折线图、直方图、散点图、饼图等丰富的统计图&#xff0c;安装使用 pip install…

Java进阶(二):Java设计模式

目录 设计模式 一.建模语言 二.类之间的关系 1.依赖关系 2.关联关系 3.聚合关系 4.组合关系 5.继承关系 6.实现关系 三.面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置 接口隔离原则 迪米特原则 组合/聚合(关联关系)复用原则 四.23种设计模式…

双层Git管理项目,github托管显示正常

双层Git管理项目&#xff0c;github托管显示正常 背景 在写React项目时&#xff0c;使用Next.js,该项目默认由git托管。但是我有在项目代码外层记笔记的习惯&#xff0c;我就在外层使用了git托管。 目录如下 code 层内也有.git 文件&#xff0c;对其托管。 我没太在意&…

群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].

群晖docker获取私有化镜像提示http: server gave HTTP response to HTTPS clien 问题描述 层级时间用户事件Information2023/07/08 12:47:45cxlogeAdd image from xx.xx.31.240:1923/go-gitea/gitea:1.19.3Error2023/07/08 12:47:48cxlogeFailed to pull image [Get "http…

机器学习:支持向量机

支持向量机&#xff08;Support Vector Machine&#xff09;是一种二类分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的广义线性分类器&#xff0c;其学习策略便是间隔最大化&#xff0c;最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…

相互作用感知的蛋白-小分子对接模型 - Interformer 评测

Interformer 是一个应用于分子对接和亲和力预测的深度学习模型&#xff0c;基于 Graph-Transdormer 架构的模型&#xff0c;利用相互作用&#xff08;氢键、疏水&#xff09;感知的混合密度网络&#xff08;interaction-aware mixture den sity network&#xff0c; MDN&#x…