相对布局

RelativeLayout 是一个以相对位置显示子视图的视图组。每个视图的位置可以指定为相对于同级元素的位置(例如,在另一个视图的左侧或下方)或相对于父级 RelativeLayout 区域的位置(例如在底部、左侧或中心对齐)。

注意:为获得更好的性能和工具支持,您应该改为使用 ConstraintLayout 构建布局

RelativeLayout 是一个非常强大的界面设计实用工具,因为它可以消除嵌套视图组并使布局层次结构保持扁平化,从而提高性能。如果您发现自己使用了多个嵌套的 LinearLayout 组,只需用一个 RelativeLayout 就可以替换它们。

放置视图

RelativeLayout 可以指定子视图相对于父视图或彼此(由 ID 确定)的位置。因此,您可以按照右边框对齐两个元素,或者使它们一上一下,屏幕居中,左侧居中,等等。默认情况下,所有子视图均绘制在布局的左上角,因此您必须使用 RelativeLayout.LayoutParams 中提供的各种布局属性定义每个视图的位置。

有很多布局属性可用于 RelativeLayout 中的视图,部分示例包括:

android:layout_alignParentTop
如果为 "true",会将此视图的上边缘与父视图的上边缘对齐。
android:layout_centerVertical
如果为 "true",会将此子级在父级内垂直居中。
android:layout_below
将此视图的上边缘放置在使用资源 ID 指定的视图下方。
android:layout_toRightOf
将此视图的左边缘放置在使用资源 ID 指定的视图右侧。

这些只是几个示例。所有布局属性都记录在 RelativeLayout.LayoutParams

每个布局属性的值要么是一个布尔值,用于启用相对于父级 RelativeLayout 的布局位置,要么是一个 ID,用于引用布局中作为视图放置依据的另一个视图。

在 XML 布局中,可以按照任何顺序声明对布局中其他视图的依赖关系。例如,即使“view2”是在层次结构中声明的最后一个视图,也可以声明“view1”位于“view2”之下。以下示例演示了这种情况。

示例

控制每个视图相对位置的每个属性都已突出显示。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" >
        <EditText
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/reminder" />
        <Spinner
            android:id="@+id/dates"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_below="@id/name"
            android:layout_alignParentLeft="true"
            android:layout_toLeftOf="@+id/times" />
        <Spinner
            android:id="@id/times"
            android:layout_width="96dp"
            android:layout_height="wrap_content"
            android:layout_below="@id/name"
            android:layout_alignParentRight="true" />
        <Button
            android:layout_width="96dp"
            android:layout_height="wrap_content"
            android:layout_below="@id/times"
            android:layout_alignParentRight="true"
            android:text="@string/done" />
    </RelativeLayout>
    

如需详细了解可用于 RelativeLayout 的每个子视图的所有布局属性,请参阅 RelativeLayout.LayoutParams