尽管 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
必须与您希望其在每个模块中显示的方式完全一致
布局。
使用 <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_height
和 android: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>
,请参阅
布局资源。