文档章节

奇葩属性:layout_weight 的解释及使用

山哥
 山哥
发布于 2014/01/08 22:52
字数 574
阅读 8005
收藏 18

在Android的控件布局中,有一个奇葩的 layout_weight 属性,定义如下:

layout_weight : 用于指定剩余空闲空间的分割比例。用法:

<LinearLayout 
  android:orientation="horizontal">

  <TextView 
      android:layout_width="wrap_content"
      android:layout_height="wrap_height"
      android:layout_weight="1"
      android:text="888"/>

  <TextView 
      android:layout_width="wrap_content"
      android:layout_height="wrap_height"
      android:layout_weight="1"
      android:text="999999"/>

</LinearLayout>

为什么说是奇葩呢?

以上面的布局代码为例,TextView-888TextView-999999 是横向排列的2个控件,它们的layout_weight="1",说明这2个控件平分了所在LinearLayout的剩余的空闲空间, 我们很容易的就误认为这2个控件平分了水平方向的空间,即:各自占据了 50% 的宽度。

其实这是错误的,而是:TextView-999999控件所占据的宽> TextView-888所占据的宽度。因为999999字符占据的宽度大于888占据的宽度,即:w(999999) + 1/2空闲空间 > w(888) + 1/2空闲空间

这就是它奇葩的地方,很容易就让我们一直误认为是整个控件分割空间。到这里,大家一定会认为,这样的话,layout_weight 这个属性就没有什么意义了,原以为它可以分配空间呢,原来只是分割剩余空闲空间。

其实,呵呵,layout_weight 是可以用来进行整个空间的分割的,如果我们让控件的宽度定义为0,这样比如2个控件的 layout_weight="1" 就可以各自50%平分整个空间了,因为:0 + 1/2空闲空间 = 0 + 1/2空闲空间

这是一个小技巧,也是非常实用的一个实用layout_weight分割方案:定义控件的 layout_width="0dp"layout_height="0dp" 配上 layout_weight 就可以实现对整个空间的比例分割了。

下面定义了2个控件的 layout_width="0dp", layout_weight="1",实现了水平方向50%平均分割:

<LinearLayout 
  android:orientation="horizontal">

  <TextView 
      android:layout_width="0dp"
      android:layout_height="wrap_height"
      android:layout_weight="1"
      android:text="888"/>

  <TextView 
      android:layout_width="0dp"
      android:layout_height="wrap_height"
      android:layout_weight="1"
      android:text="999999"/>

</LinearLayout>

下面定义了2个控件的 layout_height="0dp", layout_weight="1",实现了竖直方向50%平均分割:

<LinearLayout 
  android:orientation="vertical">

  <TextView 
      android:layout_width="wrap_content"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:text="888"/>

  <TextView 
      android:layout_width="wrap_content"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:text="999999"/>

</LinearLayout>

layout_weight 原来是可以这么用滴 


© 著作权归作者所有

山哥

山哥

粉丝 246
博文 353
码字总数 136686
作品 0
南京
程序员
私信 提问
加载中

评论(16)

有初啊
有初啊

引用来自“iStar”的评论

首先,这是基本的使用常识,使用layout_weight都是要设置layout_height或者layout_width为0的。不过你很有探索精神,赞一个!
官方都没说过要把那个设置为0dp, IDE提示都只是说设置为0dp会提升性能. 除此之外, 设置为0dp时, 系统在布局时不需要考虑其他附加参数, 如wrap_content, 就直接根据layout_weight设定来布局. 另外, 如果设置了wrap_content, 就得优先使得View的宽高满足了wrap_content设定, 而后才去根据layout_weight来填充剩余空间. p.s. to LZ: 没觉得哪里奇葩了....
aoyingzb
aoyingzb
有了新的了解,感谢楼主分享。3
devstore
devstore
十万悬赏评测,大奖等你来拿。DevStore等待开发者的到来。devstore。cn
QGlaunch
QGlaunch
83
赵亮-碧海情天
赵亮-碧海情天
虽然手机开发这几年很火,去年也被送了一本手机开发的书,但每当想看看时,一看这种XML的糟糕格式(WEB开发已经被XML毁了好久一段时间)和与此选择相配套的啰嗦命名习惯,就毫无兴趣。若非工作所迫,绝无必要找虐现在看此类内容,坐等象JS中的jQuery那样真正为程序员考虑的设计思想和命名风格的出现。
Maxium_R
Maxium_R
一点都不奇葩啊
lolita1992
lolita1992
match_content 不可以?
加入x中国
http://developer.android.com/guide/topics/ui/layout/linear.html

Equally weighted children

To create a linear layout in which each child uses the same amount of space on the screen, set the android:layout_height of each view to "0dp" (for a vertical layout) or the android:layout_width of each view to "0dp" (for a horizontal layout). Then set the android:layout_weight of each view to "1".
TiHou
TiHou
一直以来都是这样用的。。。。
岚风暴
难怪用fill和warp,match时候用weight会出现各种不理解的分割样式.. 原来是剩余空间分割,我还一直当时强制分割. 当然之前都说用fill
不可忽视的布局属性layout_weight,彻底纠正网上很多对于该属性的片面理解

Android:layout_weight详解 中文定义: 在一个布局组件中(例如:LinearLayout)中各个子元素的对于剩余空间的使用权重。 默认:android:layout_weight= 0 默认情况下,布局模式以android:h...

迷途d书童
2012/03/05
515
0
LinearLayout的weight属性的解释

刚刚在stackoverflow上看到一个关于android LinearLayout的weight属性的解释,觉得解释很透彻,帖过来和大家分享一下。 In a nutshell, specifies how much of the extra space in the layo...

林泳坛
2015/10/08
50
0
android-weight属性的理解

当属性为match_parent时:weight属性可以理解为优先级; <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layoutwidth="matchparent" android:layouthei......

pointerException
2015/07/28
0
0
适配不同尺寸屏幕几个关键点分享

在实际工作中,我们在进行实战解决的时候,我们需要从两个方面进行操作: 第一:我们要支持各种屏幕尺寸。比如说,3寸,4寸,4.5寸以及5寸等。不一样的尺寸,我们需要进行适配。 第二:就是对...

2018/01/12
0
0
坑爹的android:Layout_weight属性

今天调整界面的时候遇到了一个需求,在一个fill_parent的水平的LinearLayout中有两个RelativeLayout,这两个RelativeLayout之间的宽度要求为2:3,我第一时间的反应就是使用android:Layout_we...

PepsiZero
2012/12/03
9.7K
4

没有更多内容

加载失败,请刷新页面

加载更多

研究下这代码,用到了guava和线程池

import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import c......

暗中观察
13分钟前
0
0
《css 揭秘》 之垂直居中的实现

最近看了 Lea Verou 的 《css揭秘》一书,让我对自己的 css学习产生了深深的怀疑。这本书真是太棒了,里面涉及到很多优雅又有趣的效果实现,真的是非常棒。如果你有时间,十分建议你去看看。...

IrisHuang
19分钟前
1
0
java 抽象类(2)

/*需求: 描述一个图形、圆形、 矩形三个类。不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式不一致而已。常量的命名规范:全部字母大写,单词与单词 之间 使用下...

hellation_
21分钟前
0
0
总结:堆和栈

堆 堆比较好理解,即存放对象的地方。这里的对象由GC管理 1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命...

浮躁的码农
27分钟前
1
0
JavaScript 新语法详解:Class 的私有属性与私有方法

译者按: 为什么偏要用**#**符号? 原文:JavaScript's new #private class fields 译者:Fundebug 本文采用意译,版权归原作者所有 proposal-class-fields与proposal-private-methods定义了 ...

Fundebug
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部