Android:深度探究线性布局LinearLayout中权重(layout_weight)属性

本文详细介绍了在Android开发中,LinearLayout布局中layout_weight属性的使用。通过实例展示了当子视图的width或height设置为wrap_content和fill_parent时,如何按权重分配空间,并解释了为何实际效果可能与预期不同的原因。内容包括权重生效前的尺寸计算以及权重分配的逻辑,帮助开发者更好地理解和应用这一特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在LinearLayout布局中,子控件对于父布局的分割显得尤为重要,在不考虑适配的情况,我们可以设置具体的高度和长度来分配。但这样对于不同尺寸的设备要分别进行绘测,另一方面这样做代码的可复用性也是相当低的

所以,今天我们要介绍的是LiearLayout中的layout_weight属性,通过设置它可以按权重分割父布局(LinearLayout)

在讲解之前,提前说明一个使用规则,即在垂直排列的LinearLayout中,我们优先考虑子控件layout_height属性与layout_weight的搭配使用;反之,在水平排列的LinearLayout中,我们优先考虑子控件中layout_width与layout_weight的搭配。在下面的讲解中,统一将上面两种情况的layout_height与layout_width称为【排列方向属性】

1、排列方向属性为wrap_content
我们选用水平排列的LinearLayout进行本次演示,在布局中分别创建三个TextView。将它们的layout_width属性均设为“wrap_content”,分别将它们的layout_weight设置为1,2,3。相关布局代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <TextView
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:text="ONE"
        android:background="#00FFFF"
        />
    <TextView
        android:layout_weight="2"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:text="TWO"
        android:background="#FFFF00"
        />
    <TextView
        android:layout_weight="3"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:text="THREE"
        android:background="#FF00FF"
        />
</LinearLayout>
这里写图片描述
经测绘,TextView1的宽度为0.74inches,TextView2的宽度为1.25inches,TextView3的宽度为1.84inches

仔细观察,这三个控件的宽度比并不是1:2:3

为什么呢?

因为在layout_weight生效前,要提前将子控件的layout_width属性计算进内,我们来验证一下:

ONE、TWO的长度是0.25inches、0.375inches

这样三个控件去除内容宽度的结果约为:0.49、1、1.47

比例除去测量精度之后大概为:1:2:3

所以,这验证了“在layout_weight生效前,要提前将子控件的layout_width属性计算进内”

2、排列方向属性为fill_parent
接下来,我们将TextView的layout_width属性改为“fill_parent”,看看效果:

这里写图片描述

为什么TextView3目标丢失?且TextView1和TextView2比例不协调?

别着急,聪明的你在看完上面一节的内容后一定会记住这句话
“在layout_weight生效前,要提前将子控件的layout_width属性计算进内”

计算步骤:

因为fill_parent代表子控件与父控件相应属性一致,所以在这里设父控件的宽度为x:

3个子控件各占1个x的宽度,剩余宽度为x - 3x = -2x
按照1:2:3进行分配:

第1个:x+(-2x*1/6)=(2/3)x
第2个:x+(-2x*2/6)=(1/3)x
第3个:x+(-2x*3/6)= 0

因此,以2:1的方式显示前两个子控件,隐藏第3个控件是正确且可解释的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值