使用include 重新使用布局

虽然Android提供了各种小部件来提供小型和可重复使用的交互元素,但您可能还需要重新使用需要特殊布局的更大组件。
要有效地重复使用完整布局,可以使用<include/><merge/>标记在当前布局中嵌入另一个布局。

重用布局特别强大,因为它允许您创建可重用的复杂布局。 例如,是/否按钮面板,或带有描述文本的自定义进度条。 它还意味着可以提取,管理多个布局中常见的应用程序的任何元素,然后将其包含在每个布局中。 因此,虽然您可以通过编写自定义视图来创建单独的UI组件,但您可以通过重新使用布局文件来更轻松地创建它。

一、创建可重复使用的布局
如果您已经知道要重用的布局,请创建一个新的XML文件并定义布局。 例如,这是一个布局,用于定义要包含在每个活动中的标题栏(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>

根视图应该是您希望在添加此布局的每个布局中显示的方式。

注意:以上XML中的工具:showIn属性是一个特殊属性,在编译期间被删除,仅在Android Studio的设计时使用 - 它指定包含此文件的布局,因此您可以预览(和编辑)此文件为它嵌入在父布局中时出现。

二、使用<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>

您还可以通过在<include/>标记中指定它们来覆盖所包含布局的根视图的所有布局参数(任何android:layout_ *属性)。 例如:

<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/>标记有助于消除视图层次结构中的冗余视图组。 例如,如果主布局是垂直LinearLayout,其中两个连续视图可以在多个布局中重复使用,则放置两个视图的可重用布局需要自己的根视图。 但是,使用另一个LinearLayout作为可重用布局的根将导致垂直LinearLayout内的垂直LinearLayout。 除了降低UI性能之外,嵌套的LinearLayout没有任何实际用途。

为避免包含此类冗余视图组,您可以使用<merge>元素作为可重用布局的根视图。 例如:

<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/>标记。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容