转自:http://blog.csdn.net/kangyaping/article/details/7400281

在网上看了一些对Layout_weight的讲解,有些说的比较片面,只列举了一种情况,然后自己通过实验和一些比较好的文章总结了一下,特此记录下来,以备以后所用。Layout_weight是线性布局,也就是LinearLayout里面用到的,下面通过实验来看这个Layout_weight的特性。

1.当控件的属性android:layout_width="fill_parent"时,布局文件如下:

Xml代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal" android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <Button android:layout_width="fill_parent"
  6. android:layout_height="wrap_content" android:layout_weight="1"
  7. android:text="Button1" />
  8. <Button android:layout_width="fill_parent"
  9. android:layout_height="wrap_content" android:layout_weight="2"
  10. android:text="Button2" />
  11. </LinearLayout>

在这里Button1的Layout_weight=1,Buttong2的Layout_weight=2,运行效果为:

我们看到,Button1占了2/3,Button2占了1/3。如果此时把button2的weight设置成2000,不是说Button2就消失了,而是Button1的宽度几乎占满了屏幕宽度,而屏幕最后一丝细条则是留给Button2的,已近非常小了,没有显示出来。截图如下:

得出结论:在layout_width设置为fill_parent的时候,layout_weight代表的是你的控件要优先尽可能的大,但尽可能大是有限度的,即fill_parent.

2.当控件的属性android:layout_width="wrap_content"时,布局文件如下:

Xml代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal" android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <Button android:layout_width="wrap_content"
  6. android:layout_height="wrap_content" android:layout_weight="1"
  7. android:text="Button1" />
  8. <Button android:layout_width="wrap_content"
  9. android:layout_height="wrap_content" android:layout_weight="2"
  10. android:text="Button2" />
  11. </LinearLayout>

同样,Button1的weight设置为1,Button2的weight设置为2,但是效果与fill_parent的效果截然相反。运行效果如下:

这时,和fill_parent正好相反,Button1的宽度占据了屏幕宽度的1/3,而Button2的宽度占据了屏幕的2/3,如果此时把Button1的weight设置为2000,按照之前理解,Button1应该小的几乎在屏幕上看不到,但是错了,实验告诉我们,当Button1的weight非常小时,也要"wrap_content",也就是要保证Button1至少能够显示。以下是Button1设置weight为2000时的运行截图:

我们看到,Button1已经足够小,但是要保证他能显示出来,因此得出结论:

在layout_width设置为wrap_content的时候,layout_weight代表的是你的控件要优先尽可能的小,但这个小是有限度的,即wrap_content.

当了解这些后,我们再设计程序时,为了能够自适应屏幕,不想给控件一个指定的宽度和高度,就可以使用这个weight属性来让它按自己比例来划分屏幕高度或者宽度了。

linearLayout中包含有weight的child时,linearLayout会measure两次:
设屏幕宽度为X
第一次:button1的measuredWidth为X,button2也为X (因为用了weight,所以linearLayout每次measure child时不考虑前一个已经占用的大小),total_width为2X
第二次:计算delta=x-total_width=-x,然后会将button1的宽度设为
x+delta*1/3=0.66x, button2的宽度为 x+delta*2/3=0.33x
 那我现在对这句话重新概括一下:“因为设置了button1的权重最小,所以它占用的布局优先级就越高”,也许在Android里面布局并没有优先级之说,我这里只是为了说明问题,自己定义的,所以朋友们不要拍砖。

那首先分析一下当layout_width属性设置为fill_parent的时候,即充满父布局,当然意思是这个控件要根据weight的设置尽可能的大,因此,依上例而论,button1的weight设为1,button2的weight设置为2.即button的优先级最高,因此,要填充父布局就要button1先来填充,尽可能的大,那这个尽可能又是多少呢,这就要综合layout里其他控件的weight值了,然后做一下运算,button1占据2/3,button2占据1/3.你也可以把button2设置为一个非常大的数,比如2000,此时在Graphical Layout模式下可以看到button1填充满了整个宽度,而看不到button2的影子,事实上button2还是存在的,你把鼠标指向button1的后面就可以看到一个长长的竖条,那个就是button2,已经非常非常小了。因此,在layout_width设置为fill_parent的时候,weight所代表的是你的控件要优先尽可能的大。

接着是当layout_weight设置为wrap_content的时候,即适应内容的宽度,意思是这个控件要尽可能的小,只要能把内容显示出来就可以了,同样的,如果把button1和button2的layout_weight设置为wrap_content后,button1的weight为1,button2的weight为2.那么button1要优先尽可能的小,而button2也要尽可能的小,只是优先级不一样,因为设置了weight,所以这两个控件总的宽度要填满父布局的宽度,所以就又要计算每个控件所占据的大小,此时,button1的优先级较高,共有两份,一份1/3,一份2/3,button1要尽可能的小,那button1当然要选1/3,因此,我们看到的效果反而是button2占据的较大。这里要说的是如果把权值同样做如下设置:button1为1,button2为2000,那button1是不是就要占据1/2000的空间呢?这么理解就错了,刚才说了,要尽可能的小,但这个小是有一个限度的,那就是wrap_content,就是还要是内容完完整整的显示出来,同样的,尽可能的大也是有一个限度的,那就是父布局的宽度。因此,在layout_width设置为wrap_content的时候,weight所代表的是你的控件要优先尽可能的大。

所以,要对weight做了解,要深深的理解下面两句话:

所以,要对weight做了解在layout_width设置为fill_parent的时候,layout_weight所代表的是你的控件要优先尽可能的大,但这个大是有限度的,即fill_parent.
在layout_width设置为wrap_content的时候,layout_weight所代表的是你的控件要优先尽可能的小,但这个小是有限度的,即wrap_content.

当填充属性是wrap_content时,随着layout_weight的变大,该控件的优先级越高,

当填充属性是fill_parent时,随着layout_wight的变大,该控件的优先级越低

,两者正好相反

转载于:https://www.cnblogs.com/qingblog/archive/2012/07/09/2582669.html

Android布局之weight属性解析相关推荐

  1. Mono for Android布局控件属性小结

    1. layout_weight 用于给一个线性布局中的诸多视图的重要度赋值. 所有的视图都有一个layout_weight值,默认为零,意思是需要显示 多大的视图就占据多大的屏幕空 间.若赋一个高于 ...

  2. Android布局文件的布局方式

    Android布局文件的属性值解析说明:   1.android:id [为控件指定相应的ID] 2.android:text [指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xm ...

  3. Android布局中margin与padding的区别

    我们知道Android开发不仅仅有代码的动态控制,而且还涉及到布局的静态搭建(xml).几乎在每一个xml文件中,我们总会看到margin和padding这两个属性,今天让我们初步探究一下它们之间的区 ...

  4. Android:线性布局介绍,线性布局weight属性,线性布局微调参数gravity,线性布局divider

      LinearLayout:线性布局 一.线性布局介绍 新建一个工程 然后我们默认的布局,是相对布局, 相对布局的意思是我的控件可以在里面随意放置 那如果把这个RelativeLayout 改了呢? ...

  5. Android常见XML属性解析

    常见XML属性解析 属性 描述 android:id android:id的设置,通常有三种方式,详见下文 android:layout_width 控件宽度 android:layout_heigh ...

  6. Android 布局属性 Android:layout_weight 总结

    Android 为我们提供了五种布局方式 线性布局:LinerLayout 表格布局:TableLayout 相对布局:RelativeLayout 绝对布局:AbsoluteLayout 帧布局:F ...

  7. Android应用开发(1)---Android五大UI布局的特有属性

    Android五大UI布局的特有属性 Android五大UI布局 1. LinearLayout 线性布局 2. RelativeLayout 相对布局 3. FrameLayout 帧布局,空白布局 ...

  8. android 布局属性

    android 布局属性 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直 ...

  9. [Android]Android布局文件中的android:id=@*属性使用方法汇总以及介绍

    由于项目需要进行Android开发,因此一边开发,一边查阅资料,一边总结了Android布局文件中android:id="@*"属性的使用方法汇总以及介绍.id资源的引用 andr ...

最新文章

  1. 邁向IT專家成功之路的三十則鐵律 鐵律十七:IT人休閒之道-清心
  2. iOS设计模式四部曲(三):行为型模式 内附Demo
  3. AT3557 Four Coloring 切比雪夫距离 + 四色构造
  4. java非阻塞锁_Java并发问题的非阻塞解决方案
  5. 大数据之-Hadoop完全分布式_集群中分发脚本xsync_集群环境中同时配置大量主机---大数据之hadoop工作笔记0033
  6. OpenCasCade由一个基础形状拉伸形成其它形状的问题
  7. 解决谷歌浏览器 Google Chrome不能拖拽安装离线插件的办法
  8. AudioToolbox之AudioQueue.h(二)Creating and Disposing of Audio Queues
  9. opencc中文维基wiki百科简体繁体之间的转换解决
  10. Python运算(五)统计statistic模块
  11. 用函数统计各分数段人数c语言,excel统计各分数段人数的函数
  12. 日常一记(3)--禁止excel自动运行宏
  13. 保姆级教程:最新下载及安装vscode(含常用插件)
  14. 华为鸿蒙系统基于安卓系统方面有哪些提升
  15. 【醒悟】揭露炸鸡鸭背后的真相:一位良心发现者的自白
  16. element 合并单元格
  17. for循环语法以及range函数
  18. QT+ObjectARX 2022
  19. Google Earth Engine(gee)中的FeatureCollection
  20. oracle 本地ocr,1.Oracle OCR/OLR管理

热门文章

  1. oracle的delete语句加速,Oracle delete语句调优一例
  2. CSDN博文中完美地去掉图片水印、调整图片位置和大小
  3. http http应用
  4. JSP简单练习-数组应用实例
  5. MyEclipse-Web开发时何时重启tomcat、重新部署
  6. 音乐播放器的实现-音乐文件的获取(1)
  7. 嵌入式linux文件系统格式,嵌入式Linux的文件系统分区及数据读写方法与流程
  8. python爬虫——随机生成headers
  9. matlab实现滑动平均滤波(二)
  10. 可信计算 沈昌祥_沈昌祥院士在南宁开展网络安全前沿知识讲座