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