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

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

    

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

时间: 2024-10-14 03:32:00

Android的layout_weight和weightSum的相关文章

Android技术14:Android中layout_weight属性解析

为了更好的对空间进行布局,在LinearLayout中使用layout_weight,然后对于这一属性,在有些书上或者Android的初学者直接认为layout_weight值越大,控件权重就越大,所占用的空间就越大或者layout_wight值越小,控件空间就越大.这两种都是片面的,没有真正认识到layout_weight含义以及如何布局.下面首先演示使用代码为什么会有这两种感觉. 1.演示权重成反比 LinearLayout设置水平布局,然后里面空间宽度为fill_parent,layout

安卓基础之按比例布局layout_weight和weightSum

再看开发文档中对layout_weight属性的描述: "定义weight总和的最大值.如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值.一个典型的案例是:通过指定子视图的layout_weight属性为0.5,并设置LinearLayout的weightSum属性为1.0,实现子视图占据可用宽度的50." XML文件仅仅包含一个Button,它的宽度占据整个屏幕的一半,代码如下: [html] view plaincopy <LinearLa

【转】android中layout_weight的理解

android Layout_weight的理解 SDK中的解释: Indicates how much of the extra space in the LinearLayout will be allocated to the view associated with these LayoutParams. Specify 0 if the view should not be stretched. Otherwise the extra pixels will be pro-rated 

Android:Layout_weight的深刻理解

最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个能够说的清楚的,于是自己结合网上资料研究了一下,终于迎刃而解,写出来和大家分享. 首先看一下Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重.很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间. 看下面代码: <?xml version="1.0" encoding="utf-8"?

Android中layout_weight的属性理解

https://www.zybuluo.com/zzudhj/note/102067 在Android开发过程中,在编写布局文件经常会用layout_weight属性:从字面意思上看权重.比值.按比例... 通过例子来看看layout_weight的用法 example1:  该布局有三部分组成,title.edit.bottom,其中,为了满足edit可以填充父窗口,可以为EditText添加layou_weight属性.通过Dump view UI hierarchy for Automat

浅谈Android中layout_weight

引言 在开发android过程中,我们经常需要对界面进行按比例进行布局,我们一般都会使用layout_属性来进行设置.今天这篇文章我们就来简单介绍下layout_weight的使用和布局原理.随着做项目经验的积累,该篇博文可能会时时更新. LinearLayout下使用layout_weight 今天我们先来介绍下在LinearLayout下使用layout_weight的问题.假设我们需要实现例如一下这样的效果: 我们来看这时候的布局样式设置: 1 <!--调整横屏时的布局 --> 2 &l

转载:Android:Layout_weight的深刻理解

本文转自:http://blog.csdn.net/xiechengfa/article/details/38334327 近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个能够说的清楚的,于是自己结合网上资料研究了一下,终于迎刃而解,写出来和大家分享. 首先看一下Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重.很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间. 看

[转]Android:Layout_weight的深刻理解

最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个能够说的清楚的,于是自己结合网上资料研究了一下,终于迎刃而解,写出来和大家分享. 首先看一下Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重.很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间. 看下面代码: <?xml version="1.0" encoding="utf-8"?

android:layout_weight属性详解

1. 按比例显示LinearLayout内各个子控件,需设置android:layout_width="0dp",如果为竖直方向的设置android:layout_height="0dp".在这种情况下某子个控件占用LinearLayout的比例为:本控件weight值 / LinearLayout内所有控件的weight值的和. 2. 所以,要对weight做了解,要深深的理解下面两句话:   在layout_width设置为fill_parent的时候,layo