通过 <include> 重复使用布局

尽管 Android 提供了多种 widget 来提供可重复使用的小型互动元素, 您可能还需要重复使用需要特殊布局的大型组件。为了高效地重复使用 完整布局,请使用 <include><merge> 标记来嵌入 将一个布局放入另一个布局中。

这样,您就可以创建复杂的布局,例如“是”或“否”按钮面板或自定义进度 显示有说明文字的栏这也意味着,您可以从您的应用中提取 是在多个布局中通用的,请分开管理这些元素并将它们添加到每个布局中。虽然 则可以编写自定义界面组件, View,您可以更轻松地 重复使用布局文件

创建可重复使用的布局

首先,创建一个新的 XML 文件,并定义您希望能够重复使用的布局。对于 下面的布局定义了要添加到每个 activity 中的标题栏 (titlebar.xml):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/titlebar_bg"
    tools:showIn="@layout/activity_main" >

    <ImageView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/gafricalogo" />
</FrameLayout>

View 必须与您希望其在每个模块中显示的方式完全一致 布局。

<ph type="x-smartling-placeholder">

使用 <include> 标记

在要添加可重复使用的组件的布局中,添加 <include> 标记之间。例如,下面的布局包含 前面的示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">

    <include layout="@layout/titlebar"/>

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello"
              android:padding="10dp" />
    ...
</LinearLayout>

您还可以替换所有布局参数,即任何 android:layout_* 属性 - 通过在 <include> 标记。具体可见以下示例:

<include android:id="@+id/news_title"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         layout="@layout/title"/>

不过,如果您想使用 <include> 标记替换布局属性, 还会替换 android:layout_heightandroid:layout_width, 其他布局属性才会生效。

使用 <merge> 标记

在一个布局中添加另一个布局时,<merge> 标记有助于消除视图层次结构中的冗余视图组。<merge> 的一个用例是 通过扩展 ViewGroup 来实现自定义视图。

例如,如果您的主布局是纵向布局 LinearLayout,其中 连续视图可在多个布局中重复使用,那么用于放置 两个视图需要自己的根视图。但是,使用另一个 LinearLayout 作为根 会在一个垂直布局中LinearLayout LinearLayout。嵌套的 LinearLayout 没有实际用途,并且速度会变慢 会降低界面性能

您可以改为扩展 LinearLayout 来创建自定义视图并使用布局 XML 来描述其子视图。XML 中的顶部标记是 <merge>,而不是 LinearLayout,如以下示例所示:

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

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/add"/>

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/delete"/>

</merge>

当您将此布局添加到另一个布局中时(使用 <include>) 标记 - 系统会忽略 <merge> 元素,并将两个按钮 来代替 <include> 标记。

如需详细了解 <include>,请参阅 布局资源