布局资源

布局资源定义 Activity 或 UI 组件中 UI 的架构。

文件位置
res/layout/文件名.xml
文件名用作资源 ID。
编译后的资源数据类型
指向 View (或子类) 资源的资源指针
资源引用
在 Java 中:R.layout.文件名
在 XML 中:@[:]layout/文件名
语法
<?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> 元素,但只能有一个根元素,并且必须包含 xmlns:android 属性,其中包含如上语法示例中所示的 android 命名空间。

元素
<ViewGroup>
用于其他 View 元素的容器。存在许多不同类型的 ViewGroup 对象,并且每个对象都允许您以不同的方式指定子元素的布局。不同类型的 ViewGroup 对象包括 LinearLayoutRelativeLayoutFrameLayout

不要假设任何 ViewGroup 的派生类都接受嵌套视图。某些视图组是 AdapterView 类的实现,该类仅从 Adapter 中确定其子项。

属性

android:id
资源 ID。元素的唯一资源名称,您可以使用它从应用中获取对 ViewGroup 的引用。有关更多信息,请参阅 android:id 的值 部分。
android:layout_height
尺寸或关键字必需。组的高度,以尺寸值 (或 尺寸资源) 或关键字 ("match_parent""wrap_content") 表示。有关更多信息,请参阅 android:layout_height 和 android:layout_width 的值 部分。
android:layout_width
尺寸或关键字必需。组的宽度,以尺寸值 (或 尺寸资源) 或关键字 ("match_parent""wrap_content") 表示。有关更多信息,请参阅 android:layout_height 和 android:layout_width 的值 部分。

基类 ViewGroup 支持更多属性,并且 ViewGroup 的每个实现都支持更多属性。有关所有可用属性的参考,请参见 ViewGroup 类的相应参考文档,例如 LinearLayout XML 属性

<View>
一个单独的 UI 组件,通常称为小部件。各种 View 对象包括 TextViewButtonCheckBox

属性

android:id
资源 ID。元素的唯一资源名称,您可以使用它从您的应用程序中获取对 View 的引用。有关更多信息,请参见 android:id 的值 部分。
android:layout_height
尺寸或关键字必需。元素的高度,以尺寸值(或 尺寸资源)或关键字("match_parent""wrap_content")表示。有关更多信息,请参见 android:layout_height 和 android:layout_width 的值 部分。
android:layout_width
尺寸或关键字必需。元素的宽度,以尺寸值(或 尺寸资源)或关键字("match_parent""wrap_content")表示。有关更多信息,请参见 android:layout_height 和 android:layout_width 的值 部分。

基类 View 支持更多属性,并且 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> 元素子级的父 View 的布局中时非常有用。

这在您计划使用 <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_height 和 android:layout_width 的值

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

描述
match_parent 将尺寸设置为与父元素的尺寸匹配。在 API 级别 8 中添加,以弃用 fill_parent
wrap_content 仅将尺寸设置为适合此元素内容所需的尺寸。

自定义视图元素

您可以创建自定义 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);
}
另请参见