ITEEDU


RelativeLayout

版本:Android 2.3 r1

 

结构

继承关系

public class RelativeLayout extends ViewGroup

        

java.lang.Object

android.view.View

android.view.ViewGroup

         android.widget.RelativeLayout

 

子类及间接子类

直接子类

                  DialerFilter, TwoLineListItem

 

类概述

RelativeLayout顾名思义,相对布局,在这个容器内部的子元素们可以使用彼此之间的相对位置或者和容器间的相对位置来进行定位。

注意,不能在RelativeLayout容器本身和他的子元素之间产生循环依赖,比如说,不能将RelativeLayout的高设置成为WRAP_CONTENT的时候将子元素的高设置成为 ALIGN_PARENT_BOTTOM

(译者注:这点额外要注意,当然这也很好理解,如果容器是不定高的,那么子元素当然无法对齐容器的底边^_^)。

可以参考官方SDK中的 RelativeLayout教学贴Relative Layout tutorial

 

常量

数据类型

常量名称

描述

int

ABOVE

定义将元素的底边对齐另一个元素的顶边

int

ALIGN_BASELINE

定义将元素基线的对齐另一个元素的基线

int

ALIGN_BOTTOM

定义将元素底边的对齐另一个元素的底边

int

ALIGN_LEFT

定义将元素的左边对齐另一个元素的左边

int

ALIGN_PARENT_BOTTOM

定义将元素的底边对齐其父容器(RelativeLayout)的底边

int

ALIGN_PARENT_LEFT

定义将元素的左边对齐其父容器(RelativeLayout)的左边

int

ALIGN_PARENT_RIGHT

定义将元素的右边对齐其父容器(RelativeLayout)的右边

int

ALIGN_PARENT_TOP

定义将元素的顶边对齐其父容器(RelativeLayout)的顶边

int

ALIGN_RIGHT

定义将元素的右边对齐另一个元素的右边

int

ALIGN_TOP

定义将元素的顶边对齐另一个元素的顶边

int

BELOW

定义将元素的顶边对齐另一个元素的底边

int

CENTER_HORIZONTAL

定义让元素在容器(RelativeLayout)内水平居中

int

CENTER_IN_PARENT

定义让元素位于容器(RelativeLayout)的中心

int

CENTER_VERTICAL

定义让元素在容器(RelativeLayout)内垂直居中

int

LEFT_OF

定义将元素的右边对齐另一个元素的左边

int

RIGHT_OF

定义将元素的左边对齐另一个元素的右边

int

TRUE

 

 

内部类

Class       RelativeLayout.LayoutParams    

和RelativeLayout相关联的布局信息.

 

XML属性

属性名称

描述

android:gravity

设置容器中的内容该如何定位。对象本身的x和y轴。

android:ignoreGravity

设置容器中的哪个子元素会不受Gravity的影响.

(译者注:接收参数:子元素的Id,如果设置成为0,则全部子元素都会受到影响)

 

公共方法

public boolean dispatchPopulateAccessibilityEvent (AccessibilityEvent event)

          分发 View 的子视图中。

参数

                            event       事件本身.

                   返回值

                            如果事件分发完成,返回真。

 

public RelativeLayout.LayoutParams generateLayoutParams (AttributeSet attrs)

返回一个新的已设置属性集合的布局参数。

参数

                            attrs        构建layout布局参数的属性集合.

                   返回值

                            一个RelativeLayout.LayoutParams的实例或者他的一个子类

 

public int getBaseline ()

         返回窗口空间的文本基准线到其顶边界的偏移量。如果这个部件不支持基准线对齐,这个方法返回-1。

                   返回值

                            基准线的偏移量,如果不支持基准线对齐则返回-1

 

public void requestLayout ()

         当容器中的某个视图发生改变,会影响整个布局时,就调用这个方法,他会改变整个视图树的布局。

 

public void setGravity (int gravity)

         描述子视图该如何摆放,默认值是Gravity.LEFT | Gravity.TOP(译者注:说明RelativeLayout的元素如果不设置位置,会从左上角开始堆叠)。

参数

                            gravity    位置值,可以参考Gravity

                   相关的XML属性

                            android:gravity

                   参见

                            setHorizontalGravity(int)

setVerticalGravity(int)

 

public void setHorizontalGravity (int horizontalGravity)

 

public void setVerticalGravity (int verticalGravity))

 

public void setIgnoreGravity (int viewId)

         定义容器中的那个VIew会忽略容器设置的Gravity,如果容器设置的Gravity是Gravity.LEFT | Gravity.TOP时,定义这个属性没有任何效果。

参数

                            viewId      将要忽略容器Gravity的视图的id,设置为0则不会有任何View忽略Gravity.

                   相关的XML属性

                            android:ignoreGravity

                  参见

                            setGravity(int)

 

受保护方法

protected boolean checkLayoutParams (ViewGroup.LayoutParams p)

         (译者注:检测是不是AbsoluteLayout.LayoutParams的实例)     

 

protected ViewGroup.LayoutParams  generateDefaultLayoutParams ()

         返回一组宽度为WRAP_CONTENT,高度为WRAP_CONTENT,坐标是(0,0)的布局参数。

                   返回值

                            一组默认的布局参数或null值。

 

protected ViewGroup.LayoutParams generateDefaultLayoutParams ( ViewGroup .LayoutParams p)

         返回一组合法的受支持的布局参数。当一个ViewGroup传递一个布局参数没有通过checkLayoutParams(android.view.ViewGroup.LayoutParams)检测的视图时,此方法被调用。此方法会返回一组新的适合当前ViewGroup的布局参数,可能从指定的一组布局参数中复制适当的属性。

参数

                            p      被转换成一组适合当前 ViewGroup的布局参数.

                   返回值

                            一个ViewGroup.LayoutParams的实例或者其中的一个子节点

 

protected void onLayout (boolean changed, int l, int t, int r, int b)

         在此视图view给他的每一个子元素分配大小和位置时调用。 派生类可以重写此方法并且重新安排他们子类的布局。

参数

                            changed   这是当前视图view的一个新的大小或位置

l        相对于父节点的左边位置

t        相对于父节点的顶点位置

r        相对于父节点的右边位置

b       相对于父节点的底部位置

 

public void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

         测量视图以确定其内容宽度和高度。此方法被measure(int, int)调用。需要被子类重写以提供对其内容准确高效的测量。

约定:当重写此方法时,你必须调用setMeasuredDimension(int, int)来保存当前视图view的宽度和高度。不成功调用此方法将会导致一个IllegalStateException异常,是由measure(int, int)抛出。所以调用父类的onMeasure(int, int)方法是必须的。

父类的实现是以背景大小为默认大小,除非MeasureSpec(测量细则)允许更大的背景。子类可以重写onMeasure(int,int)以对其内容提供更佳的尺寸。

如果此方法被重写,那么子类的责任是确认测量高度和测量宽度要大于视图view的最小宽度和最小高度(getSuggestedMinimumHeight() and getSuggestedMinimumWidth()),使用这两个方法可以取得最小宽度和最小高度。

参数

                            widthMeasureSpec          强加于父节点的横向空间要求。要求是使用View.MeasureSpec进行编码。

                            heightMeasureSpec         强加于父节点的纵向空间要求。要求是使用View.MeasureSpec进行编码。

 

补充

文章精选

         [Android学习指南] 相对布局 RelativeLayout

         Android RelativeLayout 属性

          RelativeLayout 排版 _ 免寫程式[blogspot]

示例代码

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

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

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <TextView

        android:id="@+id/label"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Type here:"/>

    <EditText

        android:id="@+id/entry"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:background="@android:drawable/editbox_background"

        android:layout_below="@id/label"/>

    <Button

        android:id="@+id/ok"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_below="@id/entry"

        android:layout_alignParentRight="true"

        android:layout_marginLeft="10dip"

        android:text="OK" />

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_toLeftOf="@id/ok"

        android:layout_alignTop="@id/ok"

        android:text="Cancel" />

</RelativeLayout>