Android 布局之layout_weight解析

Android 布局之layout_weight解析

<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="horizontal">

    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:background="#ff6666"
        android:layout_height="50dp"
        android:text="Hello World!" />
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:layout_height="50dp"
        android:background="#448790"
        />
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="#ff00ff"
        />
</LinearLayout>

如上代码所示,通常我们会用LinearLayout来包住这三个TextView,然后把每个TextView的layout_weight属性和layout_width属性分别设为”1”和”0dp”,来实现下图这种平分的效果:
这里写图片描述

如果我们想以1:2:3的比例进行展示呢?那我们对代码稍作修改:

<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="horizontal">

    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:background="#ff6666"
        android:layout_height="50dp"
        android:text="Hello World! Hello World!" />
    <TextView
        android:layout_weight="2"
        android:layout_width="0dp"
        android:gravity="center"
        android:layout_height="50dp"
        android:background="#448790"
        android:text="1"
        />
    <TextView
        android:layout_weight="3"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="2"
        android:background="#ff00ff"
        />
</LinearLayout>

不就把layout_weight分别改为1、2、3嘛,so easy, 然而并卵,看结果:
这里写图片描述

你会发现如果第一个TextView的文案一行还好,一旦超过一行就会显示得有点诡异了,这尼玛是什么情况呢?其实呢,是因为这个LinearLayout它有个基准线,你会发现文本的第一行都是在同一水平线上的,怎么处理这个问题呢?
LinearLayout有个这个属性baselineAligned属性,把它设为false就可以了。

android:baselineAligned="false"

看结果:
这里写图片描述

再稍微修改下代码, 把第一个TextView的layout_width设为wrap_content:

<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:baselineAligned="false"
    android:orientation="horizontal">

    <TextView
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:gravity="center"
        android:background="#ff6666"
        android:layout_height="50dp"
        android:text="Hfasdlsdhslskdj" />
    <TextView
        android:layout_weight="2"
        android:layout_width="0dp"
        android:gravity="center"
        android:layout_height="50dp"
        android:background="#448790"
        android:text="1"
        />
    <TextView
        android:layout_weight="3"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="2"
        android:background="#ff00ff"
        />
</LinearLayout>

看结果:
这里写图片描述
发现他会优先把宽度给第一个TextView,然后剩余的宽度再去安比例分配,也就是第二个TextView占剩余宽度的2/5,第三个TextView占剩余宽度的3/5.当然r如果你把第一个TextView的宽度设为100dp,父布局也是把宽度分100dp给第一个TextView,然后剩余空间再安比例分。也就它父布局会先把减去每个子view的宽度之和,然后剩余的再去按比例分配。
不知道大家有没有去思考一个问题,android:layout_width、android:layout_height、android:layout_gravity、android:gravity、android:width、android:height等属性有什么区别呢?其实前面加layout的属性都是由父布局决定的,也就是相当于向父布局申请我要多少宽度,高度,位置要在你的哪边;而不带layout的属性是决定内容宽度、高度、位置。
对于LinearLayout,还有个android:weightSum属性,他是用来指定总权重的,如果子view的权重超过总权重就会超出屏幕。有些时候,子 view设置了权重,但是有个别子 view显示不完整,就可以通过设置这个属性来解决。因为有时候过快的layout会导致父布局来不及计算,所以先给父布局预先设置好总权重就可以避免这种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值