一 :百度 查资料 看大牛博客
学习这个属性之前,我百度了很多关于android:layout_weight属性讲解的博客,大多博主都有自己的研究和观点,他们对此属性的用法,讲解的都很全面,但是对于这个属性的文字定义却大不相同,下面我列出一些博主对此属性的文字定义:
(1)本文详细介绍了Android布局中Layout_weight的属性,它是用来分配属于空间的一个属性,你可以设置他的权重
(2)首先看一下Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重
(3)ayout_weight意思是布局比重的意思,在线性布局中常用layout_weight,分割布局。
(4)layout_weight的作用是设置子空间在LinearLayout的重要度(控件的大小比重)。layout_weight的值越低,则控件越重要
二:自己的观点
个人感觉诸如此类的说法都不太准确,下面是我自己对此属性的文字说明
(2.1)LinearLayout中的android:layout_weight属性:首先按照控件声明的尺寸进行分配,然后再将剩余尺寸按weight分配。
(2.2)具体分析上面的定义: 指的是不管android:layout_weight的值是多少,控件一开始肯定先对android:layout_width和android:layout_height的值进行尺寸分配,分配完成之后计算剩余空间的尺寸,最后对剩余空间的尺寸按照android:layout_weight的权重值分配尺寸。
(2.4)切记:android:layout_weight分配的是剩余空间的尺寸。
(2.3)所以最终控件的尺寸值应该是:(1)控件声明的尺寸值加上(2)把剩余尺寸按weight占比分配之后的值
三:举例练习
下面举一个实例说明这个问题:
注1:图5-1中的第一排的四个按钮,这里只当做一个参考物,用来和第二排的按钮进行对比(是否对齐),所以下文中所有的XML都只是第二排按钮的布局
注2:android2.2版本之后
如图5-1所示 :我们要想把第二排的按钮设置成这样的排列方式,该如何写XML代码:
我一开始会这样想,很简单嘛,btn_1的android:layout_weight="2",btn_1的android:layout_weight="1",btn_3的android:layout_weight="1",所以我写的第二排按钮的XML文件为:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="btn_1"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="btn_2"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="btn_3"/>
</LinearLayout>
上述XML对应的布局图
(1)看图5-2可以发现并不是我们想要的结果,那么这究竟是怎么回事呢?
原因就在于,我们没有考虑到控件的尺寸分配顺序。正确的顺序应该是先按照控件声明的尺寸分配,然后再把剩余的尺寸按android:layout_weight=""的值进行分配。最后把这两步计算的值相加
(2)那么具体是如何分配尺寸呢?
我们根据这个顺序一步一步来算,这里假设屏幕宽480dp
第一步:计算控件声明的尺寸:由于三个按钮都是android:layout_width="match_parent",所以得到 这三个按钮分配的尺寸都是为480dp,大家可能会有疑问,屏幕一共就480dp,三个按钮加起来都1440dp了,这怎么可能。这你不用急的,到这一步尺寸还没分配完,所以按钮不可能显示在屏幕上,只有把这些计算步骤全部算完,按钮才会显示。那么我们接着算。
第二步:计算剩余尺寸:屏幕尺寸减去刚才控件声明的尺寸480-1440=-960dp 剩余尺寸为负值,和上述情况一样,还没算完,就算算出负值,屏幕也不会分配尺寸给按钮。
第三步:计算剩余尺寸按android:layout_weight值分配后的按钮实际占有尺寸值:三个按钮对应的weight值为2,1,1
所以得出第一个按钮btn_1进行weight值分配后的尺寸为:-960×2/4=-480dp 第二个按钮btn_2:-960×1/4=-240dp 第三个按钮btn_3:-960×1/4=-240dp
第四步:计算按钮最终所占的实际尺寸值:把上述的第一步和第三步的值加起来得
btn_1:480+(-480)=0dp
btn_2:480+(-240)=240dp
btn_3:480+(-240)=240dp
这时你就恍然大悟了,为什么图5-2没有显示btn_1,而btn_2和btn_3各占一半;
四 :下面我们来正确使用android:layout_weight属性对图5-1编写XML代码
(4.1)分析:既然android:layout_weight分配的是剩余尺寸,那么我们不妨直接让控件声明的尺寸(这里就是 android:layout_width="0dp")为0dp,这样一来,剩余尺寸不就是屏幕宽度了吗,所以控件最终的尺寸就是直接把屏幕宽度按weight所占的比进行分配
(4.2)下面计算一下:
首先知道weight值分别为2,1,1
控件声明的尺寸:
btn_1:0dp
btn_2:0dp
btn_3:0dp
剩余尺寸:480-0=480dp
对剩余尺寸进行weight占比分配:
btn_1:480×2/4=240dp
btn_2:480×1/4=120dp
btn_3:480×1/4=120dp
最终尺寸:
btn_1:0dp+240dp=240dp
btn_2:0dp+120dp=120dp
btn_3:0dp+120dp=120dp
五:总结再写一遍定义:LinearLayout中的android:layout_weight属性:首先按照控件声明的尺寸进行分配,然后再将剩余尺寸按weight分配。
有些博客用很大篇幅的文字+图片的形式分析了此属性,感觉没必要的,只要知道定义和计算过程就很容易理解,至于为什么不用android:layout_width="wrap_content"的原因,看定义就知道了。wrap_content(内容包裹)是控件声明的尺寸,要是控件的内容android:text长度不一致,肯定会导致最终的布局不是你想要的占比尺寸。所以,我们得出结论:使用weight属性时,尽量将width值设为0dp
Google官方推荐,当使用weight属性时,将width设为0dip即可