布局与控件(二)——与你想象不一样的LinearLayout

更新时间修改意见
2016-08-02陈敏

第2节 LinearLayout

线性布局是安卓应用开发中最经常用到的布局之一。它能让放置与内部的控件或者子布局按照水平或竖直放置。

这里我们将介绍它最为常用的几个性质。

2.1 orientation属性

它可以让内部的控件或者子布局按照水平或者竖直方向,呈线性排列。设置android:orientation为:

  1. vertical:按照竖直方向排列;
  2. horizontal:安卓水平方向排列;
<LinearLayout
    android:layout_width="match_parent"
    android:layout_width="wrap_content"
    <!--设置水平或者竖直的值-->
    android:orientation="vertical">
    ......
</LinearLayout>

2.2 layout_weight属性

在LinearLayout包含的子布局(或者控件)中,使用这个属性,就能告诉LinearLayout,子布局(或者控件)的权重有多大,然后按照权重的比例将剩余的空间分配给它们。

举个例子:有个工地,长和宽都是100dp,它用围墙围起来,里面竖着修房子。

  1. 第一间房要修30dp长,但是设置了layout_weight2;第二间房要修20dp长,但是设置了layout_weight1;第三间要修10dp长,但是设置了layout_weight1

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="30dp" 
            android:layout_weight="2"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="20dp" 
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="10dp" 
            android:layout_weight="1"/>
    
    </LinearLayout>

    因为每个房间都设置了高度,那么这个工地最后会被分割成100 - 30 - 20 - 10,还剩下40pd的长度。

    因为都设置了layout_weight,那么这剩下的长度,将会被按照比例分配给它们。
    第一间房,额外分配 2/(2+1+1) * 40 = 20dp
    第二间房,额外分配 1/(2+1+1) * 40 = 10dp
    第三间房,额外分配 1/(2+1+1) * 40 = 10dp

    最后就是,
    第一间房 30+20 = 50dp;
    第二间房 20+10 = 30dp;
    第三间房 10+10 = 20dp;

  2. 如果我把每个房间的高度设置成0dplayout_weight都设置成1

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp" 
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp" 
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp" 
            android:layout_weight="1"/>
    
    </LinearLayout>

    那么就剩下100 - 0 - 0 - 0 = 100的高度等待分配;
    第一间房,额外分配 1/(1+1+1) * 100 = 33dp
    第二间房,额外分配 1/(1+1+1) * 100 = 33dp
    第三间房,额外分配 1/(1+1+1) * 100 = 33dp

    最后就是,
    第一间房 0+33 = 33dp;
    第二间房 0+33 = 33dp;
    第三间房 0+33 = 33dp;

  3. 如果我把每个房间的高度设置成match_parentlayout_weight设置成1

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp" 
            android:layout_weight="1"/>
    
    </LinearLayout>

    那么就剩下100 - 100 - 100 - 100 = -200的高度等待分配;
    第一间房,额外分配 1/(1+1+1) * (-200) = -66dp
    第二间房,额外分配 1/(1+1+1) * (-200) = -66dp
    第三间房,额外分配 1/(1+1+1) * (-200) = -66dp

    最后就是,
    第一间房 100+(-66) = 33dp;
    第二间房 100+(-66) = 33dp;
    第三间房 100+(-66) = 33dp;

2.3 weightSum属性

这个属性用来控制各个子布局(或者控件)的权重之和。默认情况下,权重值为各个子控件的权重之和,但是如果设置了这个属性,那么就以这个设定的值为准,将父LinearLayout设置android:weightSum属性,值为2

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:orientation="vertical"
    android:weightSum="2">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp" 
        android:layout_weight="1"/>

</LinearLayout>

剩下的长度100dp,将会被按照比例分配。
第一间房,额外分配 1/2 * 100 = 50dp(1/2是因为weightSum被设置成了2)
因为只有一间房,所以剩下的空间不用分配了

最后就是,
第一间房 0+50 = 50dp;
还剩下50dp的空间不做任何分配;

weightSum通常在布局占位的情况下使用。比如,LinearLayout中,只包含一个TextView控件,而又只希望TextView只占用LinearLayout上半空间,那么就可以这样设计,


/*******************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。

*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值