10. 【Android教程】网格布局 GridLayout

今天要学的布局和上一节的 TableLayout 很类似,是在 Android 4.0 版本引入的布局方式。GridLayout 很有意思,自从引入之后在 Android 开发圈有以下特点:

  • 大部分的开发者可能都不知道有这个布局方式的存在;
  • 有些开发者虽然知道,但是很多时候不会去使用这个布局方式;
  • 很少的开发者会花时间研究这个布局方式,也不会灵活的使用;
  • 之所以会花一个章节来讲,是希望大家能够引起重视。

1. GridLayout 的特性

顾名思义 GridLayout 可以帮助你完成各式各样的网格形式的布局,比如一个计算器、或者一个登陆框。如果你前面学扎实也许会质疑,这个可以用嵌套的 LinearLayout 来代替,这也是为什么很多人不愿意用 GridView 的原因。但是你是看过慕课网教程的人,已经是个成熟的新手了,这里我们需要强调的是**“性能”**,我们在开发中不仅要实现功能,同时要注重APP的性能。GridView 相比于 LinearLayout 层级更浅,所以它拥有更好的性能表现。这也是为什么我希望大家能够重视 GridLayout 的原因,好了,接下来看看如何使用。

2. GridLayout 的属性

GridLayout的目的是将多个 View / ViewGroup 按照网格的形式排列起来,所以大多数的属性都是为了规范一个网格的样式。

2.1 网格的总行数和总列数

  • android:rowCount: 设置网格的总行数
  • android:columnCount: 设置网格的总列数
    这两个属性直接设置一个整形数即刻,如:
    android:rowCount="3"
    android:columnCount="4"

2.2 当前 View 所在的行数、列数

  • android:layout_row: 设置当前View摆放在网格的第几行
  • android:layout_column: 设置当前View摆放在网格的第几列
    同样直接设置数字即可,注意这里是从0开始:
  android:layout_row="4"
  android:layout_column="0"

2.3 当前 View 占据的空间

  • android:layout_rowSpan: 设置当前 View 占据几行的空间
  • android:layout_columnSpan: 设置当前 View 占据几列的空间
  android:layout_rowSpan="2"
  android:layout_columnSpan="3"

3. 通过 XML 实现一个登录界面

在编写代码之前,我们先来一起来分析分析这个页面,一步一步的把它拆分成一个网格:

  • 整个页面占满全屏,我们知道直接把 GridView 的长宽设置成match_parent即可
  • 从左到右一共分为 3 列:
    • 账号/密码
    • 下划线输入框
    • 提交
  • 第一行和第二行占满全列,“提交”在最后一行的最后一列

基本上按照以上思路就可以把整个页面按照网格分割好,接下来就可以开始 xml 代码的编写了:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="3"
    android:useDefaultMargins="true">

    <TextView
        android:layout_columnSpan="3"
        android:layout_gravity="center_horizontal"
        android:text="用户登录"
        android:textSize="32sp" />

    <TextView
        android:layout_columnSpan="3"
        android:layout_gravity="left"
        android:text="请输入您的账号密码:"
        android:textSize="20sp" />

    <TextView
        android:layout_gravity="right"
        android:text="账号:" />

    <EditText android:ems="10" />


    <TextView
        android:layout_column="0"
        android:layout_gravity="right"
        android:text="密码:" />

    <EditText android:ems="8" />

    <Button
        android:layout_row="3"
        android:layout_column="2"
        android:layout_gravity="bottom"
        android:text="提交" />
</GridLayout>

以上代码有几点需要注意:

  • 我们仅仅指定了列数,系统可以根据列数计算出行数;
  • GridLayout 内部的 View 在没有设置具体的行列序号的时候,默认按照顺序依次从左往右、从上往下依次排列;
  • GridLayout 非常智能,为了向大家展示它的优势,本代码中也省略了大量的属性设置,全都交给系统自行计算。不过在实际使用中建议还是标注出来,这样可读性更高。

4. 小结

GridLayout 结合了 LinearLayout、RelativeLayout、FrameLayout、TableLayout 的当中的一些特性,它可以实现一些需要多层 View 嵌套才能实现的布局效果。我们要想与其他开发者拉开差距,就必须在编写UI的时候不只看效果是否达到,更需要考虑底层的性能损耗。这也是 GridView 的一大优势。

在实际开发中,我们往往会结合各种各样的布局完成我们的 UI,但是很重要的一点是选择你的顶层(root)布局的时候一定要深思熟虑,因为它会直接影响到你的 UI 绘制性能和内存消耗。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智能算法】蛾群算法(MSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2017年&#xff0c;AAA Mohamed等人受到飞蛾趋光行为启发&#xff0c;提出了蛾群算法&#xff08;Moth Swarm Algorithm, MSA&#xff09;。 2.算法原理 2.1算法思想 MSA设待优化问题的可行解和适…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代&#xff0c; 不同系统之间大多数是通过http调用&#xff0c;调用过程中会超时、异常等过种问题。为了保证业务稳定&#xff0c;http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用&#xff0c;实现方…

Java Lambda 表达式(详细)

Java Lambda 表达式 Lambda 的发展史 Java Lambda 表达式是在 Java 8 版本中引入的重要特性&#xff0c;它描述了一种更简洁、更灵活的方式来处理函数式编程。 在 Java 8 之前&#xff0c;要实现函数式编程&#xff0c;需要通过匿名类实现接口的方式。这样的代码通常比较冗长…

R语言数据可视化:基本绘图系统

目录 plot函数 par函数 hist函数 boxplot函数 plot函数应用实战 R语言中有三大绘图系统包括基本绘图系统&#xff0c;Lattice绘图系统&#xff0c;ggplot2绘图系统 基本绘图系统 在R语言中&#xff0c;以下函数通常用于创建和定制图形&#xff1a; plot 函数&#xff…

VMware Intel i5-10400 安装Mac 14 Sonoma

目录 安装完后的效果安装前的准备创建虚拟机创建虚拟机&#xff0c;选择典型安装。选择ISO文件选择系统类型命名虚拟机设置磁盘完成 配置虚拟机文件修改配置文件 第一次运行虚拟机选择语言选择磁盘工具格式磁盘安装macOS Sonoma 其他问题登录Apple帐户 &#xff1a; MOBILEME_C…

Unity类银河恶魔城学习记录12-7-1 p129 Craft UI - part 1源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftList.cs using System.Collections; using System.Collections.Gen…

Composer Windows 安装

Composer 的下载地址为&#xff1a;Composer 1 运行安装程序 当启动安装程序后单击下一步继续。 选择 PHP 路径 如果你的计算机上没有安装 PHP 的话&#xff0c;Composer 的安装无法继续。 你需要选择你本地安装的 PHP 路径。 配置代理地址 默认的情况下&#xff0c;可以不…

一个项目的SpringCloud微服务改造过程

SSO是公司一个已经存在了若干年的项目&#xff0c;后端采用SpringMVC、MyBatis&#xff0c;数据库使用MySQL&#xff0c;前端展示使用Freemark。今年&#xff0c;我们对该项目进行了一次革命性的改进&#xff0c;改造成SpringCloud架构&#xff0c;并且把前后端分离&#xff0c…

ES6中 Promise的详细讲解

文章目录 一、介绍状态特点流程 二、用法实例方法then()catchfinally() 构造函数方法all()race()allSettled()resolve()reject() 三、使用场景# 参考文献 一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;…

四大生成式模型的比较——GAN、VAE、归一化流和扩散模型

比较四大模型的本质 four modern deep generative models: generative adversarial networks, variational autoencoders, normalizing flows, and diffusion models 待写

Android 14 NotificationChannels与Notification的加载流程

前言 这部分我觉得三方应用使用的较多&#xff0c;分析的时候也是源码与三方应用结合分析的。 一. NotificationChannel 的创建 在源码中&#xff0c;我看到了一个很怪的类&#xff1a;NotificationChannels.java。这个类继承了 CoreStartable。 注&#xff1a;CoreStartabl…

mysqldump: Got error: 1049: Unknown database ‘root‘ when selecting the datab

1.问题描述 MySQL版本号&#xff1a;MySQL Server 8.3MySQL持久化到处数据库结构及数据 mysqldump: Got error: 1049: Unknown database root when selecting the datab2.问题解决 cmd 切换本地路径 cd /d D:\Program Files\MySQL\MySQL Server 8.3\bin执行数据库备份命令 …

uniapp vue2 时钟 循环定时器

效果展示&#xff1a; 时钟 写在前面&#xff1a;vue2有this指向&#xff0c;没有箭头函数 实验操作&#xff1a;封装一个时钟组件 uniapp vue2 封装一个时钟组件 核心代码&#xff1a; this指向的错误代码&#xff0c;在下&#xff1a; start() { this.myTimer setInterval(…

复习知识点整理

零碎语法 1.导入某个文件夹的index文件&#xff0c;index可以省略&#xff08;这里导入的是router和store文件下的index.js文件&#xff09; 2.路由懒加载 this 1.在vue文件中使用router\store对象时 this&#xff1a;普通函数的this指向vue实例对象(在没有明确指向的时候…

大语言模型上下文窗口初探(下)

由于篇幅原因&#xff0c;本文分为上下两篇&#xff0c;上篇主要讲解上下文窗口的概念、在LLM中的重要性&#xff0c;下篇主要讲解长文本能否成为LLM的护城河、国外大厂对长文本的态度。 3、长文本是护城河吗&#xff1f; 毫无疑问&#xff0c;Kimi从一开始就用“长文本”占领…

加载infercnv报错“../JAGS/modules-4/basemod.so”

library(infercnv) Error: package or namespace load failed for ‘infercnv’:.onLoad failed in loadNamespace() for rjags, details:call: load.module("basemod", quiet TRUE)error: File not found: /opt/R/4.3.2/lib64/R/../JAGS/modules-4/basemod.so 一、…

揭开Spring Bean生命周期的神秘面纱

目录 一、Spring IOC 1.1 Spring IOC 的加载过程 二、Spring Bean 生命周期 2.1 实例化前置 2.2 实例化后置 2.3 属性赋值 2.4 初始化前置 2.5 初始化 2.6 初始化后置 2.7 Bean 销毁 Spring 是一个开源的企业级Java应用程序框架&#xff0c;它简化了企业级应用程序开…

k8s资源监控_bitnami metrics-server v0(1),2024一位Linux运维中级程序员的跳槽面经

错误3 也有可能会遇到以下错误&#xff0c;按照下面提示解决 Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io) 如果metrics-server正常启动&#xff0c;没有错误&#xff0c;应该就是网络问题。修改…

基于SpringBoot的“自习室预订系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“自习室预订系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录界面 座位预订管理界面图 自习室管理…

13 Python进阶:pip及其他常用模块

pip 是 Python 包管理工具&#xff0c;它提供了对 Python 包的查找、下载、安装、卸载的功能。 包地址&#xff1a; https://pypi.org/ 最新的 Python 版本已经预装了 pip。 pip 各种命令 查看是否已经安装 pip 可以使用以下命令&#xff1a; pip --version下载安装包使用…