不可忽视的布局属性layout_weight,彻底纠正网上很多对于该属性的片面理解

迷途d书童 发布于 2012/03/05 15:42
阅读 522
收藏 2

Android:layout_weight详解

 

中文定义:

在一个布局组件中(例如:LinearLayout)中各个子元素的对于剩余空间的使用权重。

默认:android:layout_weight= 0

默认情况下,布局模式以android:height 和 android:weight为标准

 

案例:

现在设置2个LinearLayout 个占据一张,第一行有左右各一个按钮,中间设置一个文本显示框

第二行设置一个按钮,主要是为了使第一行的文本显示框自动扩张大小,布局文件如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

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

 

        <Button

            android:id="@+id/btn1"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/com_frank_android_app_cal_zero" />

 

        <TextView

            android:id="@+id/btn2"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:background="@drawable/cal_btn_numeric_shape"

            android:text="@string/com_frank_android_app_cal_one" />

 

        <Button

            android:id="@+id/btn3"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/com_frank_android_app_cal_two" />

    </LinearLayout>

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" >

 

        <Button

            android:id="@+id/btn4"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/com_frank_android_app_first_btnShow" />

    </LinearLayout>

 

</LinearLayout>

 

测试一:所有组件的宽度全部设置成 【warp_content】 包裹可显示的内容,未设置任何weight属性

结果非常简单,如下图:


改变文本显示框的大小以后,我们可以发现2号按钮无法显示了,这个事因为Android LinearLayout不同于Swing FlowLayout,无法显示的控件不会换行显示,见下图:


假设我们现在希望,0号按钮和1号按钮在文本显示框内容变化时候保持位置不变,可以利用weight来实施设置,请动手在TextView的配置文件中增加android:layout_weight = 1,这样我们将会看到下图的显示结果:


案例解释(重点):

Weight并非网上很多文章所叙述的那样(文章都过于片面),weight是指某个组件在布局中【剩余空间】中的显示权重,那么所谓的剩余空间又是什么意思呢,其实是在没有设置weight属性的控件优先显示的情况,将未占用的布局空间合理分配给设置过weight的组件

在上例中,0号和2号按钮都设置了android:width=“warp_content",因此文本显示框只能显示在2个按钮中的【剩余空间】,不管宽度如何变动都不能超过这个宽度。

 

测试二:所有组件的宽度全部设置成 【warp_content】 包裹可显示的内容,0号按钮设置weight=1、文本显示框设置weight=2, 2号按钮不设置weight,显示结果如下图:


案例解释(重点):

       首先我们可以看到,2号按钮没有设置过weight被优先显示为wrap_content了,并且占据了右侧位置(为何会占据右侧,请看下面的组件加载策略),所有剩余空间被依次分配给了0号按钮和文本显示框

由于文本显示框的权重更高(2)所以占据了剩余空间的2/3 而0号按钮只能使用1/3

注意:在文本框内容变动时候,0号按钮和2号按钮都能正常显示。因为0号按钮和文本显示框只能在剩余空间内活动,无法干涉2号按钮的显示位置。

根据测试推导出的Activity加载组建的策略:

一、主流程

开始-> 加载Activity->进入Activity生命周期->onCreate->加载layout配置文件->

加载容器组建(ViewGroup)->加载各个组件

二、组建加载流程

各组件加载完毕 -> 加载无weight属性组件的高度和宽度–>按weight和剩余空间换算有weight属性的组件的宽度或者高度(根据父容器的orientation属性决定)-> 加载他们的宽度或者高度->显示

 

提示:在版本较高的ADT中,设置了weight属性后,ADT会给出一次提示警告建议将拥有weight属性组件的高度和宽度设置成0dp,因为这个组件的宽度已经不是由配置文件能决定的了

 

读者可以自行按以上方法测试宽度等于match_parent的情况,结果将会与以上推论完全一致。

 

实际应用案例:

设计一个带有折叠列表的Dialog窗口,效果如下:


折叠打开后的效果:




原文链接:http://blog.csdn.net/frank_softworks/article/details/7320268
加载中
返回顶部
顶部