Compose | UI组件(十五) | Scaffold - 脚手架
文章目录
- 前言
- 一、Scaffold脚手架简介
- 二、Scaffold的主要组件
- 三、如何使用Scaffold
- 四、Compose中Scaffold脚手架的具体例子
- 例子1:基本Scaffold布局
- 例子2:带有Drawer的Scaffold布局
- 例子3:带有Snackbar的Scaffold布局
- 总结
前言
Compose中的Scaffold脚手架:构建现代化Android界面的基石
随着Android Jetpack Compose的推出,我们迎来了一个全新的界面开发方式。Compose以其声明式、可组合和易于测试的特性,为开发者带来了更为简洁、高效的UI开发体验。在这其中,Scaffold脚手架作为一个核心组件,为开发者提供了构建现代化Android界面的基础结构。
一、Scaffold脚手架简介
Scaffold是Compose中的一个基础布局组件,它提供了许多常用的UI元素,如AppBar、BottomBar、FloatingActionButton等,并允许开发者以声明式的方式组合这些元素。通过Scaffold,我们可以轻松地创建出具有统一风格和布局的Android应用界面。
二、Scaffold的主要组件
1.AppBar:位于屏幕顶部的应用栏,通常包含应用的标题、导航按钮等。通过Scaffold的appBar属性,我们可以轻松地为应用添加AppBar。
2.BottomBar:位于屏幕底部的导航栏,常用于显示应用的主要功能入口。Scaffold提供了bottomBar属性,使得添加BottomBar变得简单快捷。
3.FloatingActionButton:浮动操作按钮,通常位于屏幕右下角,用于执行主要操作。通过Scaffold的floatingActionButton属性,我们可以将FAB添加到界面中。
4.Drawer:侧边抽屉,用于展示额外的功能和设置。Scaffold的drawer属性允许我们方便地添加和管理侧边抽屉。
5.Snackbar:短暂显示的消息的UI组件,通常用于显示操作反馈。Scaffold提供了snackbarHost属性来管理和显示Snackbar
三、如何使用Scaffold
使用Scaffold构建界面非常简单。首先,我们需要在项目中引入Compose库。然后,在布局文件中使用Scaffold组件,并通过其属性设置AppBar、BottomBar等。下面是一个简单的示例代码:
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview @Composable
fun MyScreen() { Scaffold( appBar = { AppBar( title = { Text("My App") } ) }, bottomBar = { BottomNavigationBar( items = listOf( BottomNavigationItem(icon = { Icon(Icons.Default.Home) }, label = { Text("Home") }), BottomNavigationItem(icon = { Icon(Icons.Default.Business) }, label = { Text("Business") }) ), currentItem = 0 ) }, floatingActionButton = { FloatingActionButton(onClick = { /* FAB点击事件处理 */ }) { Icon(Icons.Default.Add) } } ) { // 主要内容区域 Text("Welcome to My App!") }
}
在这个示例中,我们创建了一个包含AppBar、BottomBar和FAB的界面。通过Scaffold的appBar、bottomBar和floatingActionButton属性,我们分别设置了这些组件。在Scaffold的主体部分,我们添加了主要的内容区域。
四、Compose中Scaffold脚手架的具体例子
在Jetpack Compose中,Scaffold脚手架为开发者提供了构建复杂应用界面的基础。下面举几个具体的例子,展示如何使用Scaffold来创建不同的UI布局。
例子1:基本Scaffold布局
@Composable
fun BasicScaffoldScreen() { Scaffold( topBar = { TopAppBar( title = { Text("Basic Scaffold") }, navigationIcon = { IconButton(onClick = { /* 导航点击逻辑 */ }) { Icon(Icons.Default.Menu, contentDescription = "Menu") } } ) }, bottomBar = { BottomNavigationBar( items = listOf( BottomNavigationItem( icon = { Icon(Icons.Default.Home, contentDescription = "Home") }, label = { Text("Home") }, selected = true ), // 添加其他导航项... ), onItemClicked = { item -> /* 导航项点击逻辑 */ } ) } // 可以在这里添加其他组件,如内容区域、FloatingActionButton等 ) { paddingValues -> // 内容区域,可以使用paddingValues来添加内边距 Box(contentAlignment = Alignment.Center, modifier = Modifier.padding(paddingValues)) { Text("This is the content area", modifier = Modifier.fillMaxSize(), textAlign = TextAlign.Center) } }
}
例子2:带有Drawer的Scaffold布局
@Composable
fun ScaffoldWithDrawerScreen() { Scaffold( drawerContent = { DrawerHeader(title = { Text("Drawer Title") }) List( items = listOf("Item 1", "Item 2", "Item 3"), modifier = Modifier.padding(16.dp) ) { item -> DrawerListItem( text = { Text(item) }, onClick = { /* Drawer项点击逻辑 */ } ) } }, topBar = { TopAppBar( title = { Text("Drawer Scaffold") }, navigationIcon = { IconButton(onClick = { /* 打开/关闭Drawer的逻辑 */ }) { Icon(Icons.Default.Menu, contentDescription = "Open Drawer") } } ) } ) { paddingValues -> // 内容区域 Box(contentAlignment = Alignment.Center, modifier = Modifier.padding(paddingValues)) { Text("This is the content area with a drawer", modifier = Modifier.fillMaxSize(), textAlign = TextAlign.Center) } }
}
例子3:带有Snackbar的Scaffold布局
@Composable
fun ScaffoldWithSnackbarScreen() { var showSnackbar by remember { mutableStateOf(false) } Scaffold( snackbarHost = { SnackbarHostState() }, topBar = { TopAppBar( title = { Text("Snackbar Scaffold") }, navigationIcon = { IconButton(onClick = { /* 导航点击逻辑 */ }) { Icon(Icons.Default.Menu, contentDescription = "Menu") } }, actions = { IconButton(onClick = { showSnackbar = true }) { Icon(Icons.Default.Notifications, contentDescription = "Show Snackbar") } } ) } ) { paddingValues -> // 内容区域 Box(contentAlignment = Alignment.Center, modifier = Modifier.padding(paddingValues)) { Text("This is the content area with a snackbar", modifier = Modifier.fillMaxSize(), textAlign = TextAlign.Center) } } // 显示Snackbar if (showSnackbar) { Snackbar( hostState = snackbarHostState, modifier = Modifier.align(Alignment.BottomStart), message = { Text("This is a snackbar message") } ) { // Snackbar操作按钮(可选) ActionButton(onClick = { showSnackbar = false }) { Text("Action") } } }
}
以上三个例子展示了如何使用Scaffold来构建不同的应用界面
总结
Scaffold作为Compose中的一个重要脚手架组件,为开发者提供了构建现代化Android界面的基础结构。
通过了解其主要组件和使用方法,我们可以更加高效地开发出具有统一风格和布局的Android应用界面。
随着Compose的不断发展壮大,Scaffold将在未来的Android开发中发挥更加重要的作用。
相关文章:
Compose | UI组件(十五) | Scaffold - 脚手架
文章目录 前言一、Scaffold脚手架简介二、Scaffold的主要组件三、如何使用Scaffold四、Compose中Scaffold脚手架的具体例子例子1:基本Scaffold布局例子2:带有Drawer的Scaffold布局例子3:带有Snackbar的Scaffold布局 总结 前言 Compose中的Sca…...
Vue-60、Vue技术router-link的replace属性
1、作用:控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式:分别是push和replace,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push 3、如何开启replace模式: <router-link rep…...
Hive与Presto中的列转行区别
Hive与Presto列转行的区别 1、背景描述2、Hive/Spark列转行3、Presto列转行 1、背景描述 在处理数据时,我们经常会遇到一个字段存储多个值,这时需要把一行数据转换为多行数据,形成标准的结构化数据 例如,将下面的两列数据并列转换…...

探讨CSDN等级制度:博客等级、原力等级、创作者等级
个人名片: 🦁作者简介:学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:Vir2021GKBS 🐼本文由…...
2.8作业
sqlite3数据库操作接口详细整理,以及常用的数据库语句 头文件: #include <sqlite3.h> 编译时候要加上-lsqlite3 gcc a.c -lsqlite3 1)sqlite3_open 打开一个数据库,如果数据库不存在,则创建一个数据库 2&am…...

机器学习中常用的性能度量—— ROC 和 AUC
什么是泛化能力? 通常我们用泛化能力来评判一个模型的好坏,通俗的说,泛化能力是指一个机器学期算法对新样本(即模型没有见过的样本)的举一反三的能力,也就是学以致用的能力。 举个例子,高三的…...

微服务入门篇:Nacos注册中心(Nacos安装,快速入门,多级存储,负载均衡,环境隔离,配置管理,热更新,集群搭建,nginx反向代理)
目录 1.Nacos安装1.官网下载2.解压到本地3.启动nacos 2.Nacos快速入门1.在父工程中导入nacos依赖2.给子项目添加客户端依赖3.修改对应服务的配置文件4.启动服务,查看nacos发现情况 3.Nacos服务多级存储模型4.NacosRule负载均衡5. 服务实例的权重设置6.环境隔离&…...

解决CORS错误(Spring Boot)
记录一下错误,以博客的形式 前言 跨域(Cross-Origin)是指在Web开发中,当一个Web应用试图从一个源(域名、协议、端口组合)获取资源时,该请求的目标与当前页面的源不同。具体来说,当一…...

NLP入门系列—词嵌入 Word embedding
NLP入门系列—词嵌入 Word embedding 2013年,Word2Vec横空出世,自然语言处理领域各项任务效果均得到极大提升。自从Word2Vec这个神奇的算法出世以后,导致了一波嵌入(Embedding)热,基于句子、文档表达的wor…...
JUnit5单元测试框架提供的注解
目录 第一章、注释在类上的注解1.1)JUnit5注释在类上的注解集成测试:SpringBootTest集成测试:ExtendWith(SpringExtension.class)单元测试:ExtendWith(MockitoExtension.class)切片测试:WebMvcTest和DataJpaTest<font colorred…...

ThinkPHP 中使用Redis
环境.env [app] app_debug "1" app_trace ""[database] database "" hostname "127.0.0.1" hostport "" password "" prefix "ls_" username ""[redis] hostname "127.0.0.1…...

Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在使用 Gin 框架处理前端请求数据时,必须关注安全性问题,以防范常见的攻击…...
MySQL数据库基础与SELECT语句使用梳理
MySQL数据库基础与SELECT语句使用梳理 注意:本文操作全部在终端进行 数据库基础知识 什么是数据库 数据库(database)是保存有组织的数据的容器(通常是一个文件或一组文件),实质上数据库是一个以某种 有组…...

scikit-learn 1.3.X 版本 bug - F1 分数计算错误
如果您正在使用 scikit-learn 1.3.X 版本,在使用 f1_score() 或 classification_report() 函数时,如果参数设置为 zero_division1.0 或 zero_divisionnp.nan,那么函数的输出结果可能会出错。错误的范围可能高达 100%,具体取决于数…...
Python面试题19-24
解释Python中的装饰器(decorators)是什么,它们的作用是什么? 装饰器是一种Python函数,用于修改其他函数的功能。它们允许在不修改原始函数代码的情况下,动态地添加功能。解释Python中的文件处理(…...
《Django+React前后端分离项目开发实战:爱计划》 01 项目整体概述
01 Introduction 《Django+React前后端分离项目开发实战:爱计划》 01 项目整体概述 Welcome to Beginning Django API wih React! This book focuses on they key tasks and concepts to get you started to learn and build a RESTFul web API with Django REST Framework,…...

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能
前言 学习资料: TensorRT 源码示例 B站视频:TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码:cookbook → 07-Tool → trtexec 官方文档:trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…...

基于SpringBoot+Vue的校园博客管理系统
末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…...

基于 SpringBoot 和 Vue.js 的权限管理系统部署教程
大家后,我是 jonssonyan 在上一篇文章我介绍了我的新项目——基于 SpringBoot 和 Vue.js 的权限管理系统,本文主要介绍该系统的部署 部署教程 这里使用 Docker 进行部署,Docker 基于容器技术,它可以占用更少的资源,…...

Redis篇之集群
一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据同…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...