Compose组件转换XML布局1.0

文章目录

  • 学习JetPack Compose资源
  • 前言:
  • 预览界面的实现
  • Compose组件的布局管理
    • 一、Row和Colum组件(LinearLayout)
      • `LinearLayout`(垂直方向 → `Column`)
      • `LinearLayout`(水平方向 → `Row`)
    • 二、相对布局 `FrameLayout` → Box
    • 三、`RelativeLayout` → **`ConstraintLayout`** 或 **`Box`**
        • 1. 用 `ConstraintLayout` 实现相对定位
        • 2. 用 `Box` 实现简单相对布局
    • 五、`GridLayout` → **`LazyVerticalGrid`** 或自定义行/列
        • 1. 网格布局
    • 六、`TableLayout` → **嵌套 `Row` 和 `Column`**
    • 七、`ScrollView` → **`Modifier.verticalScroll`** 或 **`LazyColumn`**
        • 1. 简单滚动
        • 2. 惰性滚动(大数据集用 `LazyColumn`)
    • 八、`Space` → **`Spacer`**
    • 九、`include` 标签 → **`@Composable` 函数**
        • 1. 定义可复用组件
      • 总结对比表

学习JetPack Compose资源

学习资源:JetPack Compose博物馆

前言:

在JetPack Compose博物馆中,对于compose的讲解较为详细,我这篇笔记主要是记录自己不懂和不理解的知识点,可能会重复,也可能有其他的,学习Compose布局一般都是从传统XML布局中进行转换的,接下来开始学习不同布局的Compose组件。

预览界面的实现

1、在传统的XML文件中,都是可以一边填写代码一边查看页面,在Compose如何实现呢?
首先,对一个无参的方法添加@Preview和@Composable的注解,如下图所示

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {ChainOfCustodyTheme {Text(text = "Hello Android!",modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center), // 内容居中)}
}

2、上述的图标分别为Code 、Split、Design,选择Split就可以看到分屏显示,默认为左右分屏,再次点击Split图标可以切换为上下分屏。

在这里插入图片描述

3、在添加注解的方法中,有个小图标,点击可直接在设备中运行该方法,不需要全部运行了。如下图所示在这里插入图片描述

Compose组件的布局管理

一、Row和Colum组件(LinearLayout)

看字面意思可知,Row对应XML布局中LinearLayout的水平布局,Colum对应XML布局中LinearnLayout的垂直布局

LinearLayout(垂直方向 → Column

基本用法:

@Composable
fun VerticalList() {Column(modifier = Modifier.fillMaxWidth().padding(16.dp),verticalArrangement = Arrangement.SpaceEvenly // 垂直分布方式) {Text("Item 1")Text("Item 2")Text("Item 3")}
}

等效于:

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextView ... /><TextView ... /><TextView ... />
</LinearLayout>

LinearLayout(水平方向 → Row

权重分配

@Composable
fun HorizontalWeight() {Row(modifier = Modifier.fillMaxWidth()) {Text(text = "Left",modifier = Modifier.weight(1f) // 占剩余空间的1/3.background(Color.Gray))Text(text = "Right",modifier = Modifier.weight(2f) // 占剩余空间的2/3.background(Color.LightGray))}
}

等效于

<LinearLayoutandroid:layout_width="match_parent"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1" .../><TextViewandroid:layout_width="0dp"android:layout_weight="2" .../>
</LinearLayout>

二、相对布局 FrameLayout → Box

叠加元素

@Composable
fun OverlayElements() {Box(modifier = Modifier.fillMaxSize()) {Image(painter = painterResource(R.drawable.background),contentDescription = null,modifier = Modifier.matchParentSize())Button(onClick = { /* ... */ },modifier = Modifier.align(Alignment.BottomEnd) // 右下角对齐) {Text("Action")}}
}

等效于

<FrameLayout ...><ImageView ... /><Buttonandroid:layout_gravity="bottom|end" ... />
</FrameLayout>

三、RelativeLayoutConstraintLayoutBox

使用ConstraintLayout需要额外添加依赖,注意需要和传统ConstrainLayout区分开来
依赖添加:

implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha13")
1. 用 ConstraintLayout 实现相对定位
@Composable
fun RelativePositioning() {ConstraintLayout(modifier = Modifier.fillMaxWidth()) {val (button, text) = createRefs()Button(onClick = { /* ... */ },modifier = Modifier.constrainAs(button) {start.linkTo(parent.start)top.linkTo(parent.top)}) { Text("Button") }Text(text = "Next to Button",modifier = Modifier.constrainAs(text) {start.linkTo(button.end, margin = 16.dp)top.linkTo(button.top)})}
}
2. 用 Box 实现简单相对布局
Box(modifier = Modifier.fillMaxSize()) {Text("Center", modifier = Modifier.align(Alignment.Center))Text("Top Start", modifier = Modifier.align(Alignment.TopStart))
}

五、GridLayoutLazyVerticalGrid 或自定义行/列

1. 网格布局

直接调用组件LazyVerticalGrid既可以完成实现

LazyVerticalGrid(columns = GridCells.Fixed(2), // 2列modifier = Modifier.fillMaxWidth()
) {items(10) { index ->Card(modifier = Modifier.padding(8.dp).aspectRatio(1f)) {Box(modifier = Modifier.background(Color.LightGray)) {Text("Item $index", modifier = Modifier.align(Alignment.Center))}}}
}

六、TableLayout嵌套 RowColumn

@Composable
fun TableExample() {Column(modifier = Modifier.padding(16.dp)) {// 表头行Row(modifier = Modifier.fillMaxWidth()) {Text(text = "Header 1",modifier = Modifier.weight(1f).padding(8.dp))Text(text = "Header 2",modifier = Modifier.weight(2f).padding(8.dp))}Divider(color = Color.Black, thickness = 1.dp)// 数据行Row(modifier = Modifier.fillMaxWidth()) {Text(text = "Data 1",modifier = Modifier.weight(1f).padding(8.dp)) Text(text = "Data 2",modifier = Modifier.weight(2f).padding(8.dp))}}
}

七、ScrollViewModifier.verticalScrollLazyColumn

1. 简单滚动
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
) {repeat(50) { index ->Text("Item $index", modifier = Modifier.padding(8.dp))}
}
2. 惰性滚动(大数据集用 LazyColumn
LazyColumn {items(1000) { index ->Text("Item $index", modifier = Modifier.padding(8.dp))}
}

八、SpaceSpacer

Row {Text("Left")Spacer(modifier = Modifier.weight(1f)) // 占满剩余空间Text("Right")
}

九、include 标签 → @Composable 函数

1. 定义可复用组件
@Composable
fun Header(title: String) {Text(text = title,style = MaterialTheme.typography.h4,modifier = Modifier.padding(16.dp))
}// 在父布局中调用
Column {Header("Settings")// 其他内容...
}


总结对比表

传统布局Compose 替代方案关键特性
LinearLayout(垂直)ColumnverticalArrangement 控制垂直间距
LinearLayout(水平)RowhorizontalArrangement 控制水平间距
FrameLayoutBoxalign 控制子项对齐方式
RelativeLayoutConstraintLayout通过 linkTo 定义约束关系
GridLayoutLazyVerticalGrid固定列数或自适应列宽
TableLayout嵌套 RowColumn通过 weight 实现单元格比例
ScrollViewModifier.verticalScroll简单滚动内容
ListView/RecyclerViewLazyColumn/LazyRow惰性加载 + 自动复用
SpaceSpacer空白占位
include@Composable 函数直接调用自定义组件

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

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

相关文章

从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.1模型偏见与安全对齐(Red Teaming实践)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 大语言模型全栈开发指南:伦理与未来趋势 - 第五部分:行业应用与前沿探索5.2.1 模型偏见与安全对齐(Red Teaming实践)一、模型偏见的来源与影响1. 偏见的定义与分类2. 偏见的实际影响案例二、安全对齐…

java基础 迭代Iterable接口以及迭代器Iterator

Itera迭代 Iterable < T>迭代接口(1) Iterator iterator()(2) forEach(Consumer<? super T> action)forEach结合Consumer常见场景forEach使用注意细节 (3)Spliterator spliterator() Iterator< T>迭代器接口如何“接收” Iterator<T>核心方法迭代器的…

PyTorch构建自定义模型

PyTorch 提供了灵活的方式来构建自定义神经网络模型。下面我将详细介绍从基础到高级的自定义模型构建方法&#xff0c;包含实际代码示例和最佳实践。 一、基础模型构建 1. 继承 nn.Module 基类 所有自定义模型都应该继承 torch.nn.Module 类&#xff0c;并实现两个基本方法&…

AI智算-K8s如何利用GPFS分布式并行文件存储加速训练or推理

文章目录 GPFS简介核心特性存储环境介绍存储软件版本客户端存储RoCEGPFS 管理(GUI)1. 创建 CSI 用户2. 检查GUI与k8s通信文件系统配置1. 开启配额2. 启用filesetdf文件系统3. 验证文件系统配置4. 启用自动inode扩展存储集群配置1. 启用对根文件集(root fileset)配额2. igno…

gbase8s之逻辑导出导入脚本(完美版本)

该脚本dbexport.sh用于快速导出库和导入库&#xff08;使用多并发unload&#xff0c;和多并发dbload的方式&#xff09; #!/bin/sh #脚本功能&#xff1a;将数据导出成文本&#xff0c;迁移至其他实例 #最后更新时间&#xff1a;2023-12-19 #使用方法&#xff1a; #1.执行该脚…

springMVC-拦截器详解

拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别&#xff1a;拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&#xff0c;任何ja…

网络安全应急响应-系统排查

在网络安全应急响应中&#xff0c;系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南&#xff0c;涵盖常用命令及注意事项&#xff1a; 一、Windows系统排查 1. 系统信息工具&#xff08;msinfo32.exe&#xff09; 命令执行&#x…

基于YOLO的半自动化标注方法:提升铁路视频缺陷检测效率

论文地址:https://arxiv.org/pdf/2504.01010 1. 论文结构概述 本文提出了一种半自动化标注方法,旨在解决铁路缺陷检测中大规模图像/视频数据集标注成本高、耗时长的问题。论文结构清晰,分为以下核心部分: ​引言(Introduction)​ 强调传统手动标注的痛点(耗时、易错、…

Linux驱动开发:SPI驱动开发原理

前言 本文章是根据韦东山老师的教学视频整理的学习笔记https://video.100ask.net/page/1712503 SPI 通信协议采用同步全双工传输机制&#xff0c;拓扑架构支持一主多从连接模式&#xff0c;这种模式在实际应用场景中颇为高效。其有效传输距离大致为 10m &#xff0c;传输速率…

Android Hilt 教程

Android Hilt 教程 —— 一看就懂&#xff0c;一学就会 1. 什么是 Hilt&#xff1f;为什么要用 Hilt&#xff1f; Hilt 是 Android 官方推荐的 依赖注入&#xff08;DI&#xff09;框架&#xff0c;基于 Dagger 开发&#xff0c;能够大大简化依赖注入的使用。 为什么要用 Hi…

【算法手记11】NC41 最长无重复子数组 NC379 重排字符串

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.NC41 最长无重复子数组 题目详情: 题目思路: 解题代码: 二.NC379 重排字符串 题目详情: 题目思路: 解题代码: 结语 一.NC41 最长无重复子数组 牛客网题目链接(点击即可跳转):NC41 最长…

C语言:字符串处理函数strstr分析

在 C 语言中&#xff0c;strstr 函数用于查找一个字符串中是否存在另一个字符串。它的主要功能是搜索指定的子字符串&#xff0c;并返回该子字符串在目标字符串中第一次出现的位置的指针。如果没有找到子字符串&#xff0c;则返回 NULL。 详细说明&#xff1a; 头文件&#xf…

在windows下安装spark

在windows下安装spark完成 安装过程&#xff1a;

MongoDB常见面试题总结(上)

MongoDB 基础 MongoDB 是什么&#xff1f; MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统&#xff0c;由 C 编写的。MongoDB 提供了 面向文档 的存储方式&#xff0c;操作起来比较简单和容易&#xff0c;支持“无模式”的数据建模&#xff0c;可以存储比较复杂…

【Java设计模式】第2章 UML急速入门

2-1 本章导航 UML类图与时序图入门 UML定义 统一建模语言(Unified Modeling Language):第三代非专利建模语言。特点:开放方法,支持可视化构建面向对象系统,涵盖模型、流程、代码等。UML分类(2.2版本) 结构式图形:系统静态建模(类图、对象图、包图)。行为式图形:事…

【4】搭建k8s集群系列(二进制部署)之安装master节点组件(kube-apiserver)

一、下载k8s二进制文件 下载地址&#xff1a; https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG -1.20.md 注&#xff1a;打开链接你会发现里面有很多包&#xff0c;下载一个 server 包就够了&#xff0c;包含了 Master 和 Worker Node 二进制文件。…

电子电气架构 --- AUTOSAR 的信息安全架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

ROS2与OpenAI Gym集成指南:从安装到自定义环境与强化学习训练

1.理解 ROS2 和 OpenAI Gym 的基本概念 ROS2&#xff08;Robot Operating System 2&#xff09;&#xff1a;是一个用于机器人软件开发的框架。它提供了一系列的工具、库和通信机制&#xff0c;方便开发者构建复杂的机器人应用程序。例如&#xff0c;ROS2 可以处理机器人不同组…

【设计模式】创建型 -- 单例模式 (c++实现)

文章目录 单例模式使用场景c实现静态局部变量饿汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09; 智能指针懒汉式(线程安全)智能指针call_once懒汉式(线程安全)智能指针call_onceCRTP 单例模式 单例模式是…

C语言之九九乘法表

一、代码展示 二、运行结果 三、代码分析 首先->是外层循环是小于等于9的 然后->是内层循环是小于等于外层循环的 最后->就是\n让九九乘法表的格式更加美观(当然 电脑不同 有可能%2d 也有可能%3d) 四、与以下素数题目逻辑相似 五、运行结果