Android:layout_weight属性详解

最近接触Android开发,用到layout_weight属性,查了很多关于它的用法属性详解,发现大部分文章都为开发者提供了错误的分析与解释。

主要的错误观点集中在:layout_weight属性数值越小,重要性越大。


举个例子:样例1

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:background="#aa0000"
        android:gravity="center" 
        android:text="TextView1">
    </TextView>
    
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_weight="2"
        android:background="#00aa00"
        android:gravity="center" 
        android:text="TextView2">
    </TextView>
    
</LinearLayout>

效果图:


TextView1和TextView2的weight分别是1和2,结果TextView1宽一些,TextView2窄一些

而且貌似是2:1(其实就是2:1,原因稍后说明),于是大家得出结论layout_weight属性数值越小,重要性越大。


那接着上样例: 样例2

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:background="#aa0000"
        android:gravity="center" 
        android:text="TextView1">
    </TextView>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_weight="2"
        android:background="#00aa00"
        android:gravity="center" 
        android:text="TextView2">
    </TextView>
和样例1的代码区别在哪,layout_width,样例1 的是fill_parent, 而样例2的是wrap_content

客官莫急,上结果

呃,这次竟然出了相反的效果。TextView1的width和TextView2的Width成了1:2,和设置的weight正比例。


下面引入正题:(个人观点)

android:layout_weight的属性值得意义是:将剩余的空间,按比例分配给所有控件

注:未设置layout_weight属性的默认值为0


上样例3

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="140dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:background="#aa0000"
        android:gravity="center" 
        android:text="Text1">
    </TextView>
    
    <TextView
        android:layout_width="140dp"
        android:layout_height="50dp"
        android:layout_weight="0"
        android:background="#00aa00"
        android:gravity="center" 
        android:text="Text2">
    </TextView>
    
    <TextView
        android:layout_width="140dp"
        android:layout_height="50dp"
        android:layout_weight="0"
        android:background="#0000aa"
        android:gravity="center" 
        android:text="Text3">
    </TextView>
    
</LinearLayout>

样例3的重点:layout_width都设置成了140dp,Text1的weight为1,另外两个为0。

我的avd设置的是320的,140*3=420dp,很明显不够用,差了100dp,咱们来看结果


可以看到text1好小,Text2和Text3一样长。三个Text的分别是40dp、140dp、140dp

加一起正好320dp。很奇怪是吧,为什么会出现这样的结果呢?


重复正题 :android:layout_weight的属性值得意义是:将剩余的空间,按比例分配给所有控件

三个本来都是140dp,一共420dp,屏幕就320dp,那么剩余多少dp呢, -100dp

分给谁呢?Text1的weight是1, 另外两个是0, 不好意思,Text2和Text3都分不到剩余的

于是,Text1独占了剩余的空间, 也就是-100dp,于是140dp+(-100dp)=40dp

这就是为什么样例3会出现这样的结果。

同时也说明layout_weight的剩余空间分配与layout_width也有关。


是时候来说样例1 的事情了。

样例1中,TextView1和TextView2的layout_width值均为fill_parent,layout_weight分别为1和2

fill_parent是指宽度占满整个屏幕。两个TextView分别都是占满屏幕,很明显屏幕不够用了

这时候,剩余多少空间呢, 一共一个屏幕-(TextView1占一个屏幕)-(TextView2占一个屏幕)== -(负)一个屏幕

这时候, 根据weight比重, 将剩余的空间按比例分配给TextView1, 和TextView2, 比例是1:2

所以通过weight分配给TextView1的空间是-1/3(负的三分之一屏幕)而TextView2分配得到的空间是-2/3(负的三分之二屏幕)

这是weight分配给他俩的剩余的屏幕, 他俩之前都各自有一个屏幕的空间, 

所以TextView1最终所占的空间是: fill_parent(一个屏幕) + (weight分配给它的剩余的-1/3屏幕) == 2/3屏幕

同理TextView2最终所占的空间是: fill_parent(一个屏幕) + (weight分配给它的剩余的-2/3屏幕) == 1/3屏幕

这就是TextView1和TextView2 的layout_weight比是1:2, 而所占宽度的比是2:1的原因了。

由此可见, layout_weight分配权重和layout_width有关,它分配整个屏幕 减去各个控件的layout_width所占空间后 剩余的空间。











  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值