代码改变世界

Android的layout_weight和weightSum

2015-10-20 10:07  soar.  阅读(1283)  评论(0编辑  收藏  举报

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

  android:layout_weight是用来给LinearLayout的子控件分配剩余空间,这里的剩余空间在某些情况下也会为负数。以计算子控件宽度为例(高度计算方式也一致),计算公式为:View宽度 = View原有宽度 +((LinearLayout宽度 - (所有子View宽度总和)) / 所有子View的weight总和) × 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>

  所以通过理解上面给出的公式,我们可以看出这个公式的第一步就是计算LinearLayout内的剩余空间,再将剩余空间按weight比例分配给各个子View。在公式中,每个子View的宽度等于定义时的View宽度(例如为wrap_content,则子View宽度等于自身内容宽度;fill_parent,则为填充父容器的宽度)+ 按weight分配的剩余空间宽度。如果我们将子View的宽度都设置成0dp,我们将完全可以按weight来分配子View的宽度。而反之,当我们将子View宽度设置为wrap_content时,控件宽度就会受到weight和子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

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