Android中的Layout_weight(权重)详解

 
理解权重的很重要,因为在牵涉到android应用要适应各种屏幕的时候,它将是你的程序自适应屏幕大小和分辨率的利器。所以开发中如果一开始就想到这个屏幕只适应的问题,后面的开发就会轻松的多....
布局文件是:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="horizontal"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <Button
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_weight="1"
  11. android:text="Button1"
  12. />
  13. <Button
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_weight="2"
  17. android:text="Button2"
  18. />
  19. </LinearLayout>

以上布局程序跑的结果:

出现的布局是:button1占了2/3,button2占了1/3。

但是如果将布局文件中的button的属性android:layout_width="fill_parent"改为android:layout_width="wrap_content"那么出现的结果为:button1占了1/3,button2占了2/3。

出现这样的结局是什么意思呢?
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做了解,要深深的理解下面兩句話
      1:在layout_width设置为fill_parent的時候,layout_weight所代表的是你的控件要優先盡可能的大,但這個大是有限度的,即fill_parent.
      2:在layout_width设置为wrap_content的時候,layout_weight所代表的是你的控件要優先盡可能的小,但這個小是有限度的,即wrap_content.


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值