码迷,mamicode.com
首页 > 移动开发 > 详细

Android的layout_weight和weightSum

时间:2015-10-20 10:25:20      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

  先看一下weightSum属性的功能描述:定义weight总和的最大值。如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。把weightSum的定义搁在这里,先去看看android:layout_weight如何使用。

  android:layout_weight是用来给LinearLayout的子控件分配剩余宽度的权重,每个子控件宽度计算公式为:View宽度 = View原有宽度 +((LinearLayout宽度 - (所有子View宽度总和)) / 权重最大值) × View的weight值。按照我这里给出公式,计算下面的LinearLayout中的子View宽度:

    我们假设屏幕宽度为480,假设TextView的wrap_content宽度为20

    TextView1宽度为 = 20 +((480 - (20×3)) / 2) × 0 = 20

    TextView2宽度为 = 20 +((480 - (20×3)) / 2) × 1 = 230

    TextView3宽度为 = 20 +((480 - (20×3)) / 2) × 1 = 230

    最后显示效果如下图所示:

    技术分享

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="horizontal" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:background="#0045f5"  
        android:gravity="center"  
        android:text="1" />  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:background="#00ff47"  
        android:gravity="center"  
        android:text="2"   
        android:layout_weight="1"/>  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:background="#ff5600"  
        android:gravity="center"  
        android:layout_weight="1"  
        android:text="3" />  
  
</LinearLayout>

  所以通过理解上面给出的公式,我们可以看出,如果我们将子View的宽度都设置成0dp,我们将完全可以按权重来分配子View的宽度。而反之,当我们将子View宽度设置为wrap_content时,控件宽度就会受到权重和View本身宽度两个因素影响。而当子View宽度设置为fill_parent时,对子View的影响更加明显,例如下面代码:

    我们假设屏幕宽度为480,而TextView因为宽度设置为fill_parent,所以宽度也都是480

    TextView1宽度为 = 480 +((480 - (480×3)) / 6) × 1 = 320

    TextView2宽度为 = 480 +((480 - (480×3)) / 6) × 2 = 160

    TextView3宽度为 = 480 +((480 - (480×3)) / 6) × 3 = 0

    所以结果是TextView1占了2/3,TextView2占了1/3,TextView3没有显示空间。其实无论宽度如何设置,只要按给出公式计算,我们就能明白为什么最终显示效果如此。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="horizontal" >  
  
    <TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:background="#0045f5"  
        android:gravity="center"  
        android:layout_weight="1"  
        android:text="1" />  
  
    <TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:background="#00ff47"  
        android:gravity="center"  
        android:text="2"   
        android:layout_weight="2"/>  
  
    <TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:background="#ff5600"  
        android:gravity="center"  
        android:layout_weight="3"  
        android:text="3" />  
</LinearLayout>  

    最后说一下weightSum,这个属性是设置在LinearLayout上,就像开头说的是设置weight总和的最大值。怎么理解呢?比如我们想让3个TextView按1:2:2的方式显示,需要如下代码所示设置。此时的weightSum其实是1+2+2=5,也就是说如果未指定LinearLayout的该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。那如果我手动设置weightSum,则子View的weight必须按weightSum来分配。例如我们将weightSum设置为1,而TextView1的weight设置为0.2,TextView2的weight设置为0.4,TextView3的设置为0.4,同样能够实现1:2:2的效果。所以weightSum的作用就如其定义:“定义weight总和的最大值。如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。”

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="horizontal" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="0dp"  
        android:background="#0045f5"  
        android:gravity="center"  
        android:text="1"
        android:layout_weight="1" />  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="0dp"  
        android:background="#00ff47"  
        android:gravity="center"  
        android:text="2"   
        android:layout_weight="2"/>  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="0dp"  
        android:background="#ff5600"  
        android:gravity="center"  
        android:layout_weight="2"  
        android:text="3" />  
  
</LinearLayout>  

    其实这里写的比较简单,主要是为了给自己做个笔记,把关键的稍微写一下。如果对大家帮助不大,还请见谅!

 

参考连接:

http://blog.csdn.net/xiaanming/article/details/13630837

http://book.51cto.com/art/201404/435840.htm

 参考代码:http://files.cnblogs.com/files/endure/ListViewTable.rar(给出参考连接1中的Demo加工版)

Android的layout_weight和weightSum

标签:

原文地址:http://www.cnblogs.com/endure/p/4893944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!