Android 布局系列(五):GridLayout 网格布局的使用

ops/2025/3/3 15:28:20/

引言

在 Android 开发中,布局管理是 UI 设计中的重要环节。随着应用界面的复杂性增加,开发者需要掌握各种布局方式来应对不同的需求。除了常见的 LinearLayout、RelativeLayout和ConstraintLayout,Android还提供了一个非常使用的布局 -- GridLayout

GridLayout 布局允许我们将界面元素按网格的方式进行排列,像表格一样分列分行。它为开发者提供了更高的灵活性,尤其是在需要精确控制多个子视图在行列中的位置时。尽管 GridLayout 在 Android开发中并不像LinearLayout和ConstraintLayout那样普遍使用,但在特定的场景下,它却能发挥巨大的作用,比如表单、计算器、日历等布局。

本文将深入介绍 GridLayout 布局的基本概念、常用属性、实际应用以及如何在 Android 开发中充分利用它,帮助你更好地应对复杂布局的挑战。

GridLayout 的基本概念

GridLayout 将视图放置在一个由行和列组成的网格中,可以精确控制每个视图的位置和大小。开发者可以根据需求设置网格的行数和列数。每个子视图都可以被放置在特定的行和列中,并且可以跨越多个行或列。这种布局方式特别适用于需要多个元素按规则排列的场景,如表单、计算器、日历等。

GridLayout 的常用属性

GridLayout 布局通过多个关键属性来控制子视图的排列和行为。下面介绍一些常用的属性,它们对于精确控制网格布局至关重要。

1. layout_row 和 layout_column

这两个属性用于指定视图所在的行和列。每个子视图都可以通过 layout_row 和 layout_column 来指定位置。

  • layout_row:定义子视图所在的行数。
  • layout_column:定义子视图所在的列数。

例如,如果我们有一个 GridLayout,并希望将一个按钮放置在第二行、第一列,可以这样进行设置:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"app:layout_row="1"app:layout_column="0" />

2. layout_rowSpan和layout_columnSpan

这两个属性用于定义子视图占据的行数或列数,即当你希望某个子视图跨越多个行或列时,可以使用这两个属性。

  • layout_rowSpan:定义子视图占据的行数。
  • layout_columnSpan:定义子视图占据的列数。

例如,如果你想让一个视图横跨两列,可以设置:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Span Button"app:layout_row="0"app:layout_column="0"app:layout_columnSpan="2" />

3. layout_gravity

layout_gravity 属性用于设置子视图在其单元格中的对齐方式。它定义了视图相对于其所在单元格的对齐方式。

常见的值包括:center、start、end、top、bottom、fill等。

例如,如果你希望某个视图在网格中居中对齐,可以设置:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Centered Button"app:layout_row="0"app:layout_column="1"app:layout_gravity="center" />

4. orientation

GridLayout中的orientation属性,决定了子元素自动排布的方向,是横向还是纵向。

5. columnCount 和 rowCount

这两个属性控制整个 GridLayout 的行列数量,通常需要在布局的根元素中进行设置。

例如,设置 3 列和 2 行:

<GridLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:columnCount="3"app:rowCount="2"><!-- 子视图 -->
</GridLayout>

6. layout_margin和layout_padding

这些属性用于控制子视图与网格单元格边界的间距。layout_margin控制外部间距,layout_padding控制内部间距。

例如:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Margin Button"app:layout_row="1"app:layout_column="1"android:layout_margin="10dp" />

GridLayout 的使用示例

在这个示例中,我们将使用 GridLayout 来创建一个基础的计算器界面。计算器将包含一个显示区域和若干个数字及操作符按钮,所有按钮都将按网格方式排列。

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:columnCount="4"android:rowCount="6"android:orientation="horizontal"android:layout_marginTop="200dp"android:id="@+id/main">
<!--第一行--><TextViewandroid:layout_columnSpan="4"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:background="#999234"android:layout_gravity="fill"android:padding="16dp"android:text="0"android:textColor="#FFFFFF"android:textSize="36sp" /><!-- 第二行:回退,清空 --><Buttonandroid:layout_columnSpan="2"android:layout_gravity="fill"android:text="回退"android:layout_margin="5dp"/><Buttonandroid:layout_columnSpan="2"android:layout_gravity="fill"android:text="清空"android:layout_margin="5dp"/>
<!-- 第三行 + 1 2 3--><Button android:text="+"android:layout_margin="5dp"/><Button android:text="1"android:layout_margin="5dp"/><Button android:text="2"android:layout_margin="5dp"/><Button android:text="3"android:layout_margin="5dp"/><!-- 第三行:- 4, 5, 6, - --><Button android:text="-"android:layout_margin="5dp"/><Button android:text="4"android:layout_margin="5dp"/><Button android:text="5"android:layout_margin="5dp"/><Button android:text="6"android:layout_margin="5dp"/><!-- 第四行:* 7, 8, 9, * --><Button android:text="*"android:layout_margin="5dp"/><Button android:text="7"android:layout_margin="5dp"/><Button android:text="8"android:layout_margin="5dp"/><Button android:text="9"android:layout_margin="5dp"/><!-- 第五行:/ 0, ., =, / --><Button android:text="/"android:layout_margin="5dp"/><Button android:text="0"android:layout_margin="5dp"/><Button android:text="."android:layout_margin="5dp"/><Button android:text="="android:layout_margin="5dp"/>
</GridLayout>
  1. 计算机的布局共有6行4列。
  2. 显示区域,位于第一行,使用TextView展示计算结果,横跨4列,填充方式layout_gravity设置为fill 充满单元格。
  3. 功能按钮,包括“回退”、“清空”的功能按钮,分布在第二行,每个按钮横跨2列。
  4. 数字与运算符按钮,从第三行到第五行,每行最多4个按钮。

效果如下

结语

通过这次实现,我们展示了如何利用 GridLayout 布局来创建一个简单而实用的计算器界面。GridLayout 提供了灵活的网格系统,让我们能够轻松地安排和对齐每个按钮,确保布局既美观又符合用户的操作习惯。

虽然我们实现的只是一个基础的计算器界面,但通过这种布局方式,开发者可以进一步扩展功能,比如添加更多的操作符、实现历史记录、支持更多复杂的计算等。总的来说,GridLayout 是一个功能强大的布局工具,在很多需要精确对齐和分布的场景下都能大显身手。

希望这篇文章能帮助大家更好地理解和使用 GridLayout


http://www.ppmy.cn/ops/162798.html

相关文章

stm32week5

stm32学习 二.外设 14.串口发送数据包 数据包的定义&#xff1a; HEX数据包(以0xFF为包头&#xff0c;0xFE为包尾&#xff0c;实际上可自定义)&#xff1a; 固定包长&#xff0c;含包头包尾可变包长&#xff0c;含包头包尾 对于数据中不会出现包头包尾的数据可以用可变包长…

Python实现GO鹅优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 传统BP神经网络的局限性&#xff1a;BP&#xff08;Back Propagation&#xff09;神经网络作为一种…

记录一次bug,xgplayer西瓜视频播放切进度条视频加载失败

西瓜视频的官方文档&#xff1a;西瓜播放器 大概的代码&#xff1a; <div id"video-player"></div>//初始化initXgPlayer () {this.Player new Player({id: "video-player",url: this.currentVideo.videoPath,width: "100%", heigh…

如何在Github上面上传本地文件夹

前言 直接在GitHub网址上面上传文件夹是不行的&#xff0c;需要一层一层创建然后上传&#xff0c;而且文件的大小也有限制&#xff0c;使用Git进行上传更加方便和实用 1.下载和安装Git Git - Downloads 傻瓜式安装即可 2.获取密钥对 打开自己的Github&#xff0c;创建SSH密钥&…

遇到liunx服务器IO负载,读IO流量峰值347MB/s,排查并解决。

前言&#xff1a; 根据监控报警看到IO读的速度为347MB/s。 统计时间区段 统计时长 IOPS IO流量 状态 1 工作日上班时间段&#xff1a;08:00-18:00 1小时平均值 >2000 >200 MB/s 异常 4小时平均值 >1500 >150 MB/s 异常 8小时平均值 >1000 >100 MB/s 异常…

自动化问题汇总

PLC【1】伺服轴使用前 机器人【1】机器人使用前 上位机【1】 系统【1】Window的性能测试工具无法加载性能计数器 其他【1】 PLC 【1】伺服轴使用前 机器人 【1】机器人使用前 上位机 【1】 系统 【1】Window的性能测试工具无法加载性能计数器 使用.NET时&#xff0c;编…

GPT-4.5震撼登场,AI世界再掀波澜!(3)

GPT-4.5震撼登场&#xff0c;AI世界再掀波澜! GPT-4.5震撼登场&#xff0c;AI世界再掀波澜!(2) &#xff08;一&#xff09;伦理困境&#xff1a;如何抉择 GPT-4.5 的强大功能在为我们带来诸多便利的同时&#xff0c;也引发了一系列深刻的伦理问题&#xff0c;这些问题犹如高…

《Operating System Concepts》阅读笔记:p177-p178

《Operating System Concepts》学习第 18 天&#xff0c;p177-p178 总结&#xff0c;总计 2 页。 一、技术总结 1.implicit thread A programming model that transfers the creation and management of threading from application developers to compilers and run-time l…