Google 致力于为黑人社区推动种族平等。查看具体举措

布局资源

布局资源定义了 Activity 中的界面或界面中的组件的架构。

文件位置:
res/layout/filename.xml
该文件名将用作资源 ID。
编译后的资源数据类型:
指向 View(或子类)资源的资源指针。
资源引用:
在 Java 中:R.layout.filename
在 XML 中:@[package:]layout/filename
语法:
    <?xml version="1.0" encoding="utf-8"?>
    <ViewGroup
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@[+][package:]id/resource_name"
        android:layout_height=["dimension" | "match_parent" | "wrap_content"]
        android:layout_width=["dimension" | "match_parent" | "wrap_content"]
        [ViewGroup-specific attributes] >
        <View
            android:id="@[+][package:]id/resource_name"
            android:layout_height=["dimension" | "match_parent" | "wrap_content"]
            android:layout_width=["dimension" | "match_parent" | "wrap_content"]
            [View-specific attributes] >
            <requestFocus/>
        </View>
        <ViewGroup >
            <View />
        </ViewGroup>
        <include layout="@layout/layout_resource"/>
    </ViewGroup>
    

注意:根元素可以是 ViewGroupView<merge> 元素,但只能有一个根元素,并且它必须包含带有 android 命名空间的 xmlns:android 属性,如上所示。

元素:
<ViewGroup>
其他 View 元素的容器。ViewGroup 对象有许多种类型,每一种都支持您以不同的方式指定子元素的布局。不同类型的 ViewGroup 对象包括 LinearLayoutRelativeLayoutFrameLayout

您不应假设 ViewGroup 的任何派生对象都接受嵌套的 View。有些 ViewGroupAdapterView 类的实现,该类仅从 Adapter 确定其子项。

属性:

android:id
资源 ID。元素的唯一资源名称,可用于从应用中获取对 ViewGroup 的引用。要详细了解 android:id 的值,请参见下文。
android:layout_height
尺寸或关键字。必需。组的高度,采用尺寸值(或尺寸资源)或关键字("match_parent""wrap_content")的形式。请参阅下面的有效值
android:layout_width
尺寸或关键字。必需。组的宽度,采用尺寸值(或尺寸资源)或关键字("match_parent""wrap_content")的形式。请参阅下面的有效值

ViewGroup 基类支持更多属性,而且 的每个实现又另外支持很多属性。有关所有可用属性的参考信息,请参阅 ViewGroup 类的对应参考文档(例如,LinearLayout XML 属性)。

<View>
单个界面组件,通常称为“微件”。不同类型的 View 对象包括 TextViewButtonCheckBox

属性:

android:id
资源 ID。元素的唯一资源名称,可用于从应用中获取对 View 的引用。要详细了解 android:id 的值,请参见下文。
android:layout_height
尺寸或关键字。必需。元素的高度,采用尺寸值(或尺寸资源)或关键字("match_parent""wrap_content")的形式。请参阅下面的有效值
android:layout_width
尺寸或关键字。必需。元素的宽度,采用尺寸值(或尺寸资源)或关键字("match_parent""wrap_content")的形式。请参阅下面的有效值

View 基类支持更多属性,而且 的每个实现又另外支持很多属性。如需了解详情,请参阅布局。有关所有可用属性的参考信息,请参阅对应的参考文档(例如,TextView XML 属性)。

<requestFocus>
任何代表 View 对象的元素都可以包含这个空元素,它会在屏幕上为其父项提供初始焦点。每个文件只能包含一个这种元素。
<include>
在此布局中包含一个布局文件。

属性:

layout
布局资源必需。对布局资源的引用。
android:id
资源 ID。替换提供给所含布局中的根视图的 ID。
android:layout_height
尺寸或关键字。替换提供给所含布局中的根视图的高度。仅在同时也声明了 android:layout_width 时才有效。
android:layout_width
尺寸或关键字。替换提供给所含布局中的根视图的宽度。仅在同时也声明了 android:layout_height 时才有效。

您可以在 <include> 中添加所含布局中的根元素所支持的任何其他布局属性,它们将替换根元素中定义的相应属性。

注意:如果要使用 <include> 标记来替换布局属性,您必须同时替换 android:layout_heightandroid:layout_width 才能让其他布局属性生效。

添加布局的另一种方式是使用 ViewStub。这是一个轻型视图,在对其进行明确膨胀(此时它会添加由其 android:layout 属性定义的布局文件)之前,它不会占用任何布局空间。如需详细了解如何使用 ViewStub,请参阅按需加载视图

<merge>
未在布局层次结构中绘制的替代根元素。如果您知道此布局将被放置到一个已包含相应父视图的布局中,以包含 <merge> 元素的子项,则将此元素用作根元素会非常有用。当您打算使用 <include> 将此布局添加到另一个布局文件中,并且此布局不需要不同的 ViewGroup 容器时,这样做尤其有用。如需详细了解如何合并布局,请参阅通过 <include/> 重新使用布局

android:id 的值

对于 ID 值,通常应该使用这种语法形式:"@+id/name"。加号 + 表示这是一个新的资源 ID,如果不存在,aapt 工具会在 R.java 类中创建一个新的资源整数。例如:

    <TextView android:id="@+id/nameTextbox"/>
    

nameTextbox 名称现在是附加到此元素的资源 ID。然后,您就可以在 Java 中引用与此 ID 关联的 TextView

Kotlin

    val textView: TextView? = findViewById(R.id.nameTextbox)
    

Java

    TextView textView = findViewById(R.id.nameTextbox);
    

此代码会返回 TextView 对象。

但是,如果您已经定义了一个 ID 资源并且尚未使用它,则可以通过去掉 android:id 值中的加号,将该 ID 应用到 View 元素。

android:layout_heightandroid:layout_width 的值:

高度和宽度值可使用 Android 支持的任意尺寸单位(px、dp、sp、pt、in、mm)或以下关键字来表示:

说明
match_parent 将尺寸设为与父元素的尺寸一致。在 API 级别 8 中引入以替代 fill_parent
wrap_content 将尺寸设为适配此元素的内容所需的大小。

自定义 View 元素

您可以创建自己的自定义 ViewViewGroup 元素,并将它们应用到您的布局,就像应用标准布局元素一样。您还可以指定 XML 元素中支持的属性。要了解详情,请参阅自定义组件开发者指南。

示例:
保存在 res/layout/main_activity.xml 的 XML 文件:
    <?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" >
        <TextView android:id="@+id/text"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="Hello, I am a TextView" />
        <Button android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello, I am a Button" />
    </LinearLayout>
    

此应用代码会在 onCreate() 方法中加载 Activity 的布局:

Kotlin

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
    }
    

Java

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }
    
另请参阅: