layout_weight用法详解

layout_weight是安卓布局文件中经常要用到的属性,利用该属性可以让不同屏幕大小的手机都能获得比较美观的组件布局。可是layout _weight属性配合不同的参数设计,表现效果往往是不一样的,接下来我就来介绍其用法。
一、打开Eclipse新建一个安卓工程,打开layout文件夹下默认的activity_main布局文件,将之修改为如下代码:

<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="vertical" >

    <LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" >

        <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#D99E26" android:text="文本一" android:textSize="30dp" />

        <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#901B14" android:text="文本二" android:textSize="30dp" />
    </LinearLayout>

</LinearLayout>

可以看出来,布局文件就包含两个TextView,水平分布,layout_ width和layout_height属性值均为wrap _content,即组件大小仅能够包裹自身就好。为了方便观察,我还为之设置了背景色。
运行程序,效果图如下所示,可以看到文本二右边还剩余一片空白。

二、在xml文件中再增添两个TextView组件,为之属性layout_weight=”1”,并修改文本四的宽度为“0dp”,代码如下:

<LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" >

        <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="#D66E26" android:text="文本三" android:textSize="30dp" />

        <TextView  android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="#928B14" android:text="文本四" android:textSize="30dp" />
    </LinearLayout>

程序运行后效果图如下:

为什么会有这种效果呢?
其实,layout_weight的作用就在于分配剩余空间。文本三的宽度设置为“wrap _content”,文本四的宽度为“0dp”,而它们的layout _weight都等于1。意思是,分配好组件的默认大小后,对于剩余的空间,根据1比1的比例来分配。所以,即使文本四的默认宽度为0dp,最后还要再加上分配给它的一半的剩余空间。

三、再为布局文件增添两个TextView组件,代码如下:

    <LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" >

        <TextView  android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="#D69a86" android:text="文本五" android:textSize="30dp" />

        <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="#1abB14" android:text="文本六" android:textSize="30dp" />
    </LinearLayout>

可以看到,文本五的layout_ width=”match_ parent”,即宽度充满整个父控件,文本六的layout_ width=”wrap_ content”,layout_ weight均等于1。
在这里我们不禁会疑惑,既然文本五宽度已经先占满整个空间了,那就没有剩余空间了,文本六应该就没有位置可以安放了,layout_weight属性还会有用处吗?
其实还是有的,程序运行后效果图如下:

layout_weight用法详解_第1张图片

可以看到文本六还是占了一定空间,之所以会产生这种效果,是根据如下计算方法形成的:
- 假设整个屏幕的宽度为100dp,当TextView设置layout_ width=”wrap_ content”时,假设其宽度为10dp
- 则当设置文本五的layout_ width=”match_ parent”时,其宽度应该为100dp。设置文本六的layout_ width=“wrap_content”,则其宽度应为10dp。
- 此时,还可以来计算屏幕的剩余宽度。即等于 100dp-(100dp+10dp)=-10dp。是的,这里允许是负值。
- 然后,再根据layout_weight属性,每个TextView平均分配剩余空间-10dp,即每个组件还要再加上-5dp。则文本五的宽度应为100dp-5dp=95dp,文本六的宽度应为-5dp
- 则文本六的组件应为默认大小的一半,即文本一和文本二宽度的一半

四、可以在文本六下边再增添一个TextView验证效果,代码如下:

<LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:orientation="horizontal" >

        <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#D12b86" android:text="文本七" android:textSize="30dp" />
    </LinearLayout>

运行效果如下,可以看出文本六的宽度为文本七的一半:

layout_weight的用法就讲到这里了~~

你可能感兴趣的:(android,Android布局)