正文
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)
分发 AccessibilityEvent
事件到该 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
参见
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
参见
七、受保护方法
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
RelativeLayout 排版 _ 免寫程式[blogspot]
示例代码
< 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 >