0 布局的定义

布局可以理解为一种​​容器​​,用于​​组织与排列界面上的控件​​。

  • 布局是一个相框,控件就是你要展示的照片。•

  • 你(布局规则)决定这些照片怎么排列:是从上到下整齐放(LinearLayout),还是自由定位(ConstraintLayout),还是全部叠在一起(FrameLayout)。

🔹 ​​布局的本质是树状结构​​:一个布局可以包含多个子布局或控件,子布局又可以继续嵌套,从而形成复杂的 UI 结构。

🧠 ​​常见问题:为什么别人写的布局能实现效果,我的却不行?​

很多时候是因为对​​布局类型及其属性规则​​不了解,尤其是某些属性是由​父布局决定的​​,而不是通用的。


一、布局中的属性来源分类

我们在 XML 布局文件中写的各种属性,大致可以分为以下两类:


✅ 1. 来自 ​​View 本身​​ 的属性(通用属性,大多数控件都支持)

这些属性是 ​​Android 控件共有的基本属性​​,比如:

android:id:为控件设置唯一标识符

android:layout_width:控件的宽度(如 match_parentwrap_content

android:layout_height:控件的高度

android:text:文本内容(TextView、Button 等)

android:textSize:字体大小

android:background:背景颜色或图片

android:paddingandroid:margin:内边距和外边距

android:textColor:文字颜色

📌 这些属性在任何控件中基本都有效,因为它们定义在 android.view.View或其子类中。


✅ 2. 来自 ​​父布局的 LayoutParams​​(布局参数,取决于当前控件所在的父布局类型

这些属性 ​不是控件本身的属性,而是由父布局决定的布局行为​,比如:

layout_gravity(在某些布局中控制控件在其父容器中的对齐方式)

layout_centerInParent(居中,但只有特定父布局支持)

layout_weight(权重,LinearLayout 特有)

layout_belowlayout_toRightOf(RelativeLayout 特有)

app:layout_constraintXXX(ConstraintLayout 特有)

⚠️ ​​重要提醒:​

如果你在一个布局中使用了 ​只属于某种父布局的属性,但该控件的实际父布局并不支持它,那么这个属性虽然不会报错,但也不会生效!​

例如:在 ConstraintLayout中使用 layout_centerInParent是无效的,因为它是 RelativeLayout的属性

如下面两张图,layout_centerInParent在父布局RelativeLayout中是生效的,但是在ConstraintLayout中不会报错,但是不会生效。

实际中我们在判断这个布局是否有这个属性可以通过这个方式,只要在android studio中能显示,说明就有这个属性。

二  常见布局体系总栏(详细参数去andorid官网学习)

2.1 LinearLayout (线性叠加布局):

  • 垂直方向:下一个子控件从上一个控件的底部开始排列

  • 水平方向:下一个子控件从上一个控件的右边开始排列

方法1:在xml中并且布局,然后直接在代码中加载

1.1.1 直接在Java中实现布局,不使用xml

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 1. 创建 RelativeLayout 作为根布局RelativeLayout relativeLayout = new RelativeLayout(this);relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT));relativeLayout.setBackgroundColor(Color.WHITE);// 2. 创建 LinearLayout 并设置属性LinearLayout linearLayout = new LinearLayout(this);linearLayout.setOrientation(LinearLayout.VERTICAL);linearLayout.setPadding(16, 16, 16, 16);linearLayout.setBackgroundColor(0xFF03A9F4); // holo_blue_light// 3. 添加子控件TextView textView = new TextView(this);textView.setText("我是居中的");textView.setTextSize(18);textView.setTextColor(Color.WHITE);linearLayout.addView(textView);Button button = new Button(this);button.setText("点我");linearLayout.addView(button);// 4. 设置 LinearLayout 在 RelativeLayout 中居中RelativeLayout.LayoutParams llParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);llParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);linearLayout.setLayoutParams(llParams);// 5. 把 LinearLayout 添加到 RelativeLayoutrelativeLayout.addView(linearLayout);// 6. 设置 Activity 内容为 RelativeLayoutsetContentView(relativeLayout);}
}

方法3:可以在 XML 定义布局基础结构,然后在 Java 中动态修改或添加控件

1.2 RelativeLayout(相对布局)

✅ 核心特点:

子控件通过​​相对位置​​来排列(比如相对于父布局,或相对于其他控件)

支持诸如 layout_alignParentToplayout_belowlayout_toRightOf等属性

​灵活性强,但复杂布局容易难以维护​

1.3 FrameLayout(帧布局)

✅ 核心特点:

​所有子控件默认都堆叠在左上角(0,0)位置​

后添加的控件会覆盖在先添加的控件之上(常用于叠加显示),

  • 可以通过 android:layout_gravityFrameLayout.LayoutParams.gravity 控制子控件在父容器中的位置

  • 常见值:centertop|leftbottom|right

通常用来显示​​单个全屏控件​

🎯 适用场景:

显示单一内容,比如全屏的图片、视频播放器

实现​​层叠效果​​(比如浮动按钮盖在内容上方)

用作 ​​Fragment 的容器​

举个例子,下面这个就是framelayout从zuos左上角开始叠加的布局

1.4 ConstraintLaout(约束布局)

ConstraintLayout 功能抢到,可以替代 LinearLayout、RelativeLayout、FrameLayout 等组合布局,主要特点如下:

✅ 核心特点:

通过​​控件之间的约束关系(Constraints)​​来定位,而不是嵌套

支持百分比定位、居中、偏移、链条(Chains)、屏障(Barrier)、Guideline 等高级功能

​官方推荐用于替代多层嵌套的 LinearLayout / RelativeLayout​

支持在 Android Studio 的 ​​布局编辑器中可视化拖拽约束​

🎯 适用场景:

构建​​复杂且响应式的 UI​

需要精确控制控件位置与对齐

希望减少布局嵌套层级,提升渲染性能

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"xmlns:app="http://schemas.android.com/apk/res-auto"android:background="@android:color/white"><!-- 居中显示的 LinearLayout --><LinearLayoutandroid:id="@+id/center_linear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:background="@android:color/holo_blue_light"tools:ignore="MissingConstraints"><!-- LinearLayout 内的子控件 --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是居中的"android:textSize="18sp"android:textColor="@android:color/white" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点我" /></LinearLayout><LinearLayoutandroid:id="@+id/center_linear1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"app:layout_constraintStart_toStartOf="@id/center_linear"app:layout_constraintTop_toBottomOf="@id/center_linear"android:background="@android:color/holo_green_light"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="居中的下面"android:textSize="18sp"android:textColor="@android:color/white" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点我" /></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

✅ 提示:

使用 app:layout_constraintXXX来定义控件间的约束关系

ConstraintLayout强大之处在于不用嵌套也能实现复杂布局

tip:

如果在 XML 和 Java 代码中都对同一个控件设置了相同属性,​​后设置的会覆盖前者​

所有的布局与属性设置,都是在 setContentView()之后才会真正生效嵌套太深会影响性能与渲染速度,

尽量使用 ConstraintLayout减少布局层级

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

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

相关文章

Rust语言能干什么

Rust 语言的应用范围非常广&#xff0c;几乎覆盖了现代软件开发的全部领域。它最初以“系统级语言”身份出道&#xff0c;但现在已经远远超出了这个范畴。下面我从几个关键方向给你梳理一下&#xff0c;Rust 到底能干什么&#xff0c;以及为什么在这些领域它特别有优势。 1. 系…

只需一个设置就可以解决Microsoft Edge浏览器打不开网页的问题

Microsoft Edge是一款功能强大的网络浏览器&#xff0c;预装在Windows 10、11系统中。通过这个简单易懂的教程&#xff0c;学习如何修复Microsoft Edge浏览器打不开的问题。1、打开计算机找到C盘&#xff0c;双击打开&#xff1a;2、打开【用户】➜【Admin】➜【AppData】➜【L…

AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手源码

文章的目的为了记录AI应用学习的经历&#xff0c;降低AI的入门难度。同时记录开发流程和要点有些记忆模糊&#xff0c;防止忘记。也希望可以给看到文章的朋友带来一些收获。 相关链接&#xff1a; AI 应用 图文 解说 (一) -- 百度智能云 实现 语音 聊天-CSDN博客 AI 应用 图文 …

计算机Python毕业设计推荐:基于Django的博客网站设计与实现【python/大数据/深度学习/机器学习定制】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二、…

当 AI 开始 “筛选” 信息:算法偏见会加剧认知鸿沟吗?如何构建公平的 AI 生态?

AI 筛选信息的现状与原理​在信息爆炸的时代&#xff0c;AI 筛选信息已成为各领域不可或缺的关键技术。在社交媒体平台上&#xff0c;如抖音、小红书等&#xff0c;AI 根据用户的点赞、评论、浏览历史等数据&#xff0c;精准推送用户可能感兴趣的内容&#xff0c;极大提升了用户…

2023年IEEE IOTJ SCI1区TOP,动态环境下无人机目标覆盖任务路径规划,深度解析+性能实测

目录1.摘要2.问题模型3.算法设计4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 无人机&#xff08;UAV&#xff09;作为物联网应用的重要工具&#xff0c;正广泛应用于智能农业监测、智能交通监测等领域&#xff0c;并逐渐成为国内外研究热点。然而&#x…

计算机视觉(四):二值化

二值化&#xff0c;就是将图像从彩色或灰度模式转换为只有两种颜色&#xff08;通常是黑色和白色&#xff09;的模式。这个过程的本质是设定一个阈值 (Threshold)&#xff0c;将图像中所有像素的灰度值与这个阈值进行比较。 基本原理 二值化的核心原理非常简单&#xff1a; 灰度…

(二)设计模式(Command)

文章目录项目地址一、设计模式1.1 Command Design1. 创建命令接口2. 创建支付的Command类3. CommandScheduler4. 使用1.2 Chain of Responsibility1. 接口创建2. 审批人3. 发起审批1.3 State Pattern1. 创建简单的状态机定义动作和状态状态机使用状态机1.x Iterator1.x Observe…

现代C++性能陷阱:std::function的成本、异常处理的真实开销

1. std::function 的成本 std::function 是一个通用的、类型擦除的函数包装器&#xff0c;它非常方便&#xff0c;可以存储和调用任何可调用对象&#xff08;函数、lambda、函数对象、bind表达式等&#xff09;。然而&#xff0c;这种灵活性是有代价的。 主要成本来源&#xff…

基于Spark的白酒行业数据分析与可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍一、项目背景与研究意义二、系统整体架构三、系统功能设计四、应用场景与价值五、项目特色与创新点六、总结与展望每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部…

织梦会员中心模板调用某个栏目名和栏目下文档的办法

大家在用到织梦dedecms时候&#xff0c;需要在会员中心模板调用栏目的名称和链接&#xff0c;还有某个栏目下的文档要怎么操作呢&#xff1f; 我们都知道&#xff0c;在会员中心模板&#xff0c;直接用dede:type或者dede:arclist标签是不行的&#xff0c;在会员中心调用只能用p…

区块链的法律定位:技术、工具还是资产?

高鹏律师首席数据官&#xff0c;数字经济团队创作AI辅助当我们谈论区块链时&#xff0c;我们在谈论什么&#xff1f;是那串不可篡改的哈希值&#xff0c;是去中心化的信仰图腾&#xff0c;还是藏在代码背后的权利密码&#xff1f;今天&#xff0c;我们不聊技术迭代的炫酷&#…

LeetCode每日一题,2025-8-31

dfs搜索解数独&#xff0c;重点是如何判断当前这位置的board[x][y]是否可以填数字num public class T37 {public static void main(String[] args) {char[][] board new char[][]{{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, …

Linux 进程信号学习笔记:从概念到实操

一、Linux 信号基本概念1.1 生活角度理解信号我们可以把进程比作等待快递的人&#xff0c;信号就像快递&#xff1a;识别信号&#xff1a;就像我们知道快递来了该 怎么处理&#xff0c;进程对信号的识别是内核程序员预先编写的内置特性&#xff0c;即使信号没产生&#xff0c;进…

解决多种类潮湿敏感元器件的多温度、多时长的排潮烘干

铠德科技ESD烘箱针对复杂电路产品的排潮烘干需求&#xff0c;可通过以下技术路径实现多品类元器件的高效兼容处理&#xff1a;多温区独立控制系统采用蜂窝式加热模块阵列&#xff0c;每个0.6m独立温区可设置1℃精度支持同时运行3种不同温度曲线&#xff08;典型值&#xff1a;8…

obdumper和obloader迁移OceanBase业务库(一):实施手册

obdumper和obloader迁移OceanBase业务库&#xff08;一&#xff09;&#xff1a;实施手册导出前准备全库&#xff08;模式&#xff09;数据导出全库&#xff08;模式&#xff09;数据导入导入后检查环境信息&#xff1a;OceanBase v4.3.5单机部署&#xff0c;MySQL租户OBDUMPER…

SQLSugar 快速入门:从基础到实战查询与使用指南

目录 ​编辑 一、SQLSugar 简介 二、SQLSugar 环境搭建 2.1 安装 SQLSugar 2.1.1 通过 Visual Studio NuGet 图形化界面安装 2.1.2 通过 NuGet 命令行安装 2.2 引用 SQLSugar 命名空间 三、SQLSugar 核心初始化配置 3.1 基础初始化&#xff08;非 IOC 模式&#xff09…

Python与Rust语法对比详解:从入门到精通

Python与Rust语法对比详解&#xff1a;从入门到精通 前言 Python和Rust作为当今最受关注的编程语言&#xff0c;分别代表了动态类型和静态类型语言的典型特征。本文将从语法层面深入对比这两种语言&#xff0c;帮助开发者理解它们的设计理念和使用场景。1. 基础语法结构 1.1 He…

视频加水印_带gif 加动态水印 gif水印 视频浮动水印

如果你有一个视频&#xff0c;你想给它加一个水印&#xff0c;让水印浮动&#xff0c;而且加的还是 GIF 动态图片水印&#xff0c;那么你可以使用这个工具。首先把你的两个文件拖进来&#xff0c;然后点击第三个按钮。加好了&#xff0c;打开看一下&#xff0c;我们看到这个水印…

C# 字符和字符串

原文&#xff1a;C# 字符和字符串_w3cschool 请勿将文章标记为付费&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; C&#xff03;字符和字符串 C&#xff03;的 char 类型别名 System.Char 类型表示 Unicode 字符。 在单引号中指定char字面值&#xff1a; …