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的并发能力,就需要搭建主从集群,实现读写分离。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据同…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
