转载

Android的layout_weight和weightSum

先看一下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

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

Android的layout_weight和weightSum

<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加工版)

正文到此结束
Loading...