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即可
- Android学习第五天之 android:layout_weight=""浅析
- Android学习之layout_weight
- Android学习第五天-Activity
- Android学习之android:layout_weight详解
- Android学习第一天之LinearLayout浅析
- Java -Android 学习(第五天)
- Android学习第五天,Style,和选择器
- Android第五天之ImageView图像视图
- Android第五天之ProgressBar进度条
- Android第五天之ListView列表视图
- Android第五天
- Android基础第五天
- Android基础第五天
- Android第五天
- android:layout_weight属性学习
- android之layout_weight详解
- Android布局之layout_weight
- Android笔记之layout_weight
- mac中Library not loaded: libmysqlclient.18.dylib Reason: image not found解决方案
- 使用photoswipe展示图片
- (171)乱序字符串
- Linux网络流量实时监控ifstat iftop命令详解(系列二)
- C语言编写遗传算法解决TSP旅行商问题
- Android学习第五天之 android:layout_weight=""浅析
- js动态引入css
- Openwrt下安装Python3.5运行出现异常:Fatal Python error: Py_Initialize: Unable to get the locale encoding
- Android Studio常见问题--uses-sdk:minSdkVersion 11 cannot be smaller than version 15 declared in library
- JQuery获取并解析php返回的json格式数据的简单示例
- 常用链接
- NOIP2011复赛(day1):选择客栈
- Linux 查看系统硬件信息(实例详解) ubuntu的测试环境
- js json数据的处理