Android UI 开发·界面布局开发·案例分析
目录
编辑
1. 线性布局(LinearLayout)
2. 相对布局(RelativeLayout)
3. 表格布局(TableLayout)
4. 帧布局(FrameLayout)
5. 网格布局(GridLayout)
6. 绝对布局(AbsoluteLayout)
补充内容:关于selector状态选择器
1. 线性布局(LinearLayout)
LinearLayout线性布局是一种最简单的布局方式,它有垂直和水平两种布局方向,使用“android:orientation="vertical"”属性设置可以指定布局方式为垂直,使用“android:orientation= "horizontal"”属性设置可以指定布局方式为水平。
下面我们将通过一个案例了解LinearLayout这种布局方式。
<?xml version="1.0" encoding="utf-8"?>
<!-- 最外面的布局文件为线性布局,控件纵向摆放 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><!-- 第一个内嵌布局为相对布局 --><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="2"android:background="@android:color/white" ></RelativeLayout><!-- 第二个内嵌布局为相对布局 --><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/black" ></RelativeLayout>
</LinearLayout>
LinearLayout有两个非常相似的属性: android:gravity和android:layout_ gravity。
它们都是用来设置对齐方式的,可选值包括left(左对齐)、right(右对齐)、top(上对齐)、bottom(下对齐)、center(居中)、center_horizontal(水平居中)和center_vertical(垂直居中)等,这些值还可以组合使用,中间用“|”分开。
android:gravity和android:layout_gravity的区别在于:
(1)android:gravity:用于设置该View内部内容的对齐方式。
(2)android:layout_gravity:用于设置该View在其父View中的对齐方式。
2. 相对布局(RelativeLayout)
相对布局中的视图组件是按相互之间的相对位置来确定的,并不是线性布局中的必须按行或按列单个显示,在此布局中的子元素里与位置相关的属性将生效。
例如“android:layout_below”、“android:layout_above”等。注意在指定位置关系时,引用的ID必须在引用之前,先被定义,否则将出现异常。RelativeLayout是Android布局结构中最灵活的一种布局结构,比较适合一些复杂界面的布局。
<?xml version="1.0" encoding="utf-8"?>
<!-- 最外面的布局文件为相对布局,控件纵向摆放 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><!-- 定义一个EditText,用来接收用户输入 --><EditTextandroid:id="@+id/et"android:layout_width="120dp"android:layout_height="wrap_content"android:inputType="text" /><!-- 定义一个TextView,用来显示文本信息 --><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_below="@+id/et"/><!-- 定义一个Button,用来响应用户点击 --><Buttonandroid:id="@+id/bt_ok"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/tv"android:layout_toRightOf="@+id/et"android:text="确认" />
<!-- 定义一个Button,用来响应用户点击 --><Buttonandroid:id="@+id/bt_clear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/bt_ok"android:layout_toRightOf="@+id/bt_ok"android:layout_marginLeft="25dp"android:text="清除" />
</RelativeLayout>
/* 复写监听器对象的onClick方法,完成点击后的事件处理,参数为被点击的按钮 */@Overridepublic void onClick(View v) {//根据按钮控件的id区分不同按钮的点击switch (v.getId()) {case R.id.bt_ok://获取界面控件EditText的输入内容String _Text = mEditText.getText().toString();//给界面控件TextView的文本设置为输入内容mTextView.setText(_Text);break;case R.id.bt_clear://清空界面控件EditText的文本输入内容mEditText.setText("");break;}}
}
3. 表格布局(TableLayout)
TableLayout属于行和列形式的管理控件,适用于多行多列的布局格式,每行为一个TableRow对象,也可以是一个View对象。在TableRow中还可以继续添加其他的控件,每添加一个子控件就成为一列。TableLayout不会生成边框。
表格布局的风格跟HTML中的表格比较接近,只是所采用的标签不同。<TableLayout> 是顶级元素,说明采用的是表格布局,<TableRow>定义一个行,而具体控件则定义一个单元格的内容。
<?xml version="1.0" encoding="utf-8"?>
<!-- 最外面的布局文件为表格布局 -->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:stretchColumns="0,1,2,3" ><!-- 表格布局中第一行TableRow --><TableRow><!-- 第一行的第一列控件TextView --><TextViewandroid:gravity="center"android:padding="3dip"android:text="姓名" /><!-- 第一行的第二列控件TextView --><TextViewandroid:gravity="center"android:padding="3dip"android:text="性别" /><!-- 第一行的第三列控件TextView --><TextViewandroid:gravity="center"android:padding="3dip"android:text="年龄" />
<!-- 第一行的第四列控件TextView --><TextViewandroid:gravity="center"android:padding="3dip"android:text="电话" /></TableRow>
<!-- 表格布局中第二行TableRow --><TableRow><!-- 第二行的第一列控件TextView --><TextViewandroid:gravity="center"android:padding="3dip"android:text="小明" /><!-- 第二行的第二列控件TextView -->......</TableRow>
<!-- 表格布局中第三行TableRow --><TableRow><!-- 第三行的第一列控件TextView --><TextViewandroid:gravity="center"android:padding="3dip"android:text="小王" /><!-- 第三行的第二列控件TextView -->......</TableRow>
</TableLayout>
4. 帧布局(FrameLayout)
帧布局中的每一个组件都代表一个画面,默认以屏幕左上角作为(0, 0)坐标,按组件定义的先后顺序依次逐屏显示,后面出现的会覆盖前面的画面。用该布局可以实现动画效果。
<?xml version="1.0" encoding="utf-8"?>
<!-- 最外面的布局文件为帧布局 -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height=“wrap_content” ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="A Text" ></TextView><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="A Button" ></Button>
</FrameLayout>
5. 网格布局(GridLayout)
GridLayout提供了一种新的布局方式,它可以将子视图放入到一个矩形网格中。GridLayout有以下两个构造函数:
(1)public GridLayout() 建立一个默认的GridLayout布局;
(2)public GridLayout(int numColumns, boolean makeColumnsEqualWidth)
建立一个GridLayout布局,拥有numColumns列。如果makeColumnsEqualWidth为true,则全部组件将拥有相同的宽度。
GridLayout中的元素一般不采用layout_width和layout_height来界定大小,而是采用“layout_gravity=" fill_horizontal"”或”fill_vertical”,并配合GridLayout的“android:orientation”属性来定义它里面的视图元素的大小。默认情况下,它里面的元素大小为“wrap_content”。
GridLayout中的“android:orientation”属性,决定了其中的视图元素的摆放方式,如果为“vertical”,则先摆第一列,然后第二列,以此类推;如果为“horizontal”,则先摆第一行,然后第二行,以此类推。
<?xml version="1.0" encoding="utf-8"?>
<GridLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"android:orientation="horizontal"android:rowCount="5" android:columnCount="4"> <Buttonandroid:id="@+id/one"android:text="1" /><Button android:id="@+id/two" android:text="2"/> <Button android:id="@+id/three" android:text="3"/>
<Button android:id="@+id/devide" android:text="/"/> <Button android:id="@+id/four" android:text="4"/> <Button android:id="@+id/five" android:text="5"/> <Button android:id="@+id/six" android:text="6"/> <Button android:id="@+id/multiply" android:text="×"/><Button android:id="@+id/seven" android:text="7"/> <Button android:id="@+id/eight" android:text="8"/> <Button android:id="@+id/nine" android:text="9"/> <Button android:id="@+id/minus" android:text="-"/> <Button android:id="@+id/zero" android:layout_columnSpan="2" android:layout_gravity="fill" android:text="0"/> <Button android:id="@+id/point" android:text="."/> <Button android:id="@+id/plus" android:layout_rowSpan="2" android:layout_gravity="fill" android:text="+"/> <Button android:id="@+id/equal" android:layout_columnSpan="3" android:layout_gravity="fill" android:text="="/>
</GridLayout>
6. 绝对布局(AbsoluteLayout)
AbsoluteLayout,又可以叫做坐标布局,是直接按照控件的横纵坐标在界面中进行布局。
绝对布局使用“android:layout_x”属性来确定X坐标,以左上角为顶点。使用“android: layout_y”属性确定Y坐标,以左上角为顶点。在绝对定位中,如果子元素不设置layout_x和layout_y,那么它们的默认值是0,也就是说它会像在FrameLayout一样,这个元素会出现在屏幕的左上角。
补充内容:关于selector状态选择器
selector状态选择器一般使用在各种操作状态下,主要体现在字体,背景的切换方面。
以Xml方式写出状态选择器,然后将写好的selector存在放res - drawable 或 res - color 文件夹下,较为常用。
状态设置常用类型:
//设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false
android:state_pressed
//设置是否选中状态,true表示已选中,false表示未选中
android:state_selected
//设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
android:state_checked
//设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点
android:state_focused
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/login_btn2" android:state_pressed="true"/><item android:drawable="@drawable/login_btn1"/>
</selector><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/tb_on" /> <!-- pressed --><item android:drawable="@drawable/tb_off" /> <!-- default/unchecked -->
</selector>
相关文章:

Android UI 开发·界面布局开发·案例分析
目录 编辑 1. 线性布局(LinearLayout) 2. 相对布局(RelativeLayout) 3. 表格布局(TableLayout) 4. 帧布局(FrameLayout) 5. 网格布局(GridLayout࿰…...
2023-11-06 monetdb-事务-insert-delta缓存-分析
摘要: monetdb在事务处理时, 会将数据写入delta缓存中, 然后在commit时将数据写入wal文件, 随后由控制器决定何时将wal中的数据真正的写入BAT列文件中. 本文从delta缓存入手, 分析monetdb在事务处理中的细节. SQL: DML: create table t1 (a int); 事务DDL: START TRANSACTI…...
ubuntu 22.04 flameshot 截图异常的问题
方法找了好久,终于找到一个有用的 Firstly do not install flameshot from snapstore, install it using apt. Go to /etc/gdm3/custom.confRemove the comment on #WaylandEnablefalse Your custom.conf file should be like this: # GDM configuration storag…...

正点原子嵌入式linux驱动开发——Linux WIFI驱动
WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何…...
React中的“状态”(state)和“属性”(props)的区别
在React中,"状态"(state)和"属性"(props)是两个重要的概念,它们在组件的生命周期和数据流中扮演着不同的角色。 状态(State): 状态是React组件中用…...

棋牌室电脑计时灯控,棋牌室计时灯控安装,佳易王计时计费管理系统软件
棋牌室电脑计时灯控,棋牌室计时灯控安装,佳易王计时计费管理系统软件 棋牌室的灯可以用佳易王计时计费软件来控制开关,当开始计时的时候,软件发送开灯的指令,灯打开,在结账后,软件发送关灯指令…...

P02项目诊断报警组件(学习操作日志记录、单元测试开发)
★ P02项目诊断报警组件 诊断报警组件的主要功能有: 接收、记录硬件设备上报的报警信息。从预先设定的错误码对照表中找到对应的声光报警和蜂鸣器报警策略,结合当前的报警情况对设备下发报警指示。将报警消息发送到消息队列,由其它组件发送…...

【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】
请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 T32MARM 介绍Trace32 .t32 和 .cmm 差异veloce 下启动TRACE321.1.3 TAP 状态机操作命令1.1.3.1 IDCODE(Identification Code)寄存器 介绍 T32MARM 介绍 T32MARM 是 Lauterbach 的 Trace32 …...
服务器硬件有哪些组成
服务器是由处理器、硬盘、内存、显卡、主板、网卡等组成,今天小编带大家了解一下服务器有哪些硬件吧! 1.最重要的当然就是处理器了,处理器就相当于是服务器的大脑,负责执行各种运算和指令,例如运行程序或者处理数据&am…...

【Git】Git基础命令操作速记
【Git】Git基础命令操作速记 文章目录 【Git】Git基础命令操作速记1. 初始化1.1 设置用户名和邮箱1.2 初始化仓库 2. 基础命令2.1 add和commit2.2 reset2.3 查看日志2.4 删除/找回本地仓库文件2.5 找回暂存区文件2.6 diff命令(找不同) 3. 分支命令3.1 查看分支3.2 创建分支3.3 …...
使用CDN有什么好处?
近年来,随着互联网的快速发展,越来越多的企业开始发展互联网业务,出现了各种各样的网站和web程序,互联网改变了人们的生活习惯与消费行为,人们也是越来越依赖网络,而这些改变让互联网产业得到更加迅速发展。…...

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器
信号发生器 方波,就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加,Mode为0则减;只要为0就输出zero 这样会出问题,因为要求是十进制,但是这里并没有考虑到9之后怎么办&a…...
【模型推理优化学习笔记】CUDA加速矩阵乘计算
矩阵乘可以利用gpu多线程并行的特点进行加速计算,但是传统简单的方法需要多次读取数据到寄存器中,增加耗时,因此利用gpu的共享内存可以被一个block内的所有线程访问到的特性,结合tiling技术进行加速计算。 理论部分不解释了&#…...

第三届 “鹏城杯”(初赛)
第三届 “鹏城杯”(初赛) WEB Web-web1 反序列化tostring打Hack类 Payload:O%3A1%3A%22H%22%3A1%3A%7Bs%3A8%3A%22username%22%3BO%3A6%3A%22Hacker%22%3A2%3A%7Bs%3A11%3A%22%00Hacker%00exp%22%3BN%3Bs%3A11%3A%22%00Hacker%00cmd%22%3BN%3B%7D%7D…...
React Hooks为什么要在顶层使用?
为什么必须在函数顶层使用hooks? 使用过 hooks 的小伙伴应该都会发现,hooks只能在函数式组件的顶层使用,不能在循环,条件或嵌套函数中调用 Hook。 为什么呢? 查阅了很多答案,总结如下: hook…...

Vscode Vim自动切换
在VsCode里安装了Vim插件,由于Vim插件存在Normal和Insert两种模式,会需要经常性的按shift切换中英文,太过麻烦,本文介绍一下如何通过im-select来解决。 首先先确保自己的电脑里装有英文语言包,win10系统下可以使用Win…...
C语言初学1:详解#include <stdio.h>
一、概念 #include <stdio.h> 称为编译预处理命令,它在告诉C编译器在编译时包含stdio.h文件,如果在代码中,调用了这个头文件中的函数或者宏定义,则需引用该头文件。 二、作用 stdio.h是c语言中的标准输入输出的头文件&am…...

5 Tensorflow图像识别(下)模型构建
上一篇:4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理,下面是完整的代码: import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…...

OpenCV 图像复制和图像区域读写
图像复制 共享数据, 使用 new Mat(srcMat, ...) 和 newMatsrcMat 生成新的Mat都和原Mat共享数据, 也就是说如果修改某一Mat,其他Mat也会随之改变复制全新的Mat, 使用CopyTo() 和 Clone() 方法将生成一个全新的Mat, 新Mat和原Mat不共享数据. 图像区域和点的读写 区域读取: 通过s…...

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata
文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...