Android学习第五天之 android:layout_weight=""浅析

来源:互联网 发布:unity3d教程 编辑:程序博客网 时间:2024/06/01 07:20

一  :百度 查资料 看大牛博客

      学习这个属性之前,我百度了很多关于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即可










1 0
原创粉丝点击