Layouts mit <Einschließen> wiederverwenden

Android bietet eine Vielzahl von Widgets, um kleine, wiederverwendbare und interaktive Elemente bereitzustellen. Möglicherweise müssen Sie aber auch größere Komponenten wiederverwenden, die ein spezielles Layout erfordern. Mit den Tags <include> und <merge> können Sie ein Layout in ein anderes einbetten, um vollständige Layouts wiederzuverwenden.

So können Sie komplexe Layouts wie ein Ja- oder Nein-Schaltflächenbereich oder eine benutzerdefinierte Fortschrittsanzeige mit Beschreibungstext erstellen. Außerdem können Sie alle Elemente Ihrer Anwendung extrahieren, die in mehreren Layouts vorkommen, separat verwalten und in jedes Layout einbinden. Sie können zwar einzelne UI-Komponenten durch Schreiben einer benutzerdefinierten View erstellen, geht das aber einfacher, wenn Sie eine Layoutdatei wiederverwenden.

Wiederverwendbares Layout erstellen

Erstellen Sie zuerst eine neue XML-Datei und legen Sie das Layout fest, das Sie wiederverwenden möchten. Hier ist beispielsweise ein Layout, mit dem eine Titelleiste definiert wird, die in jede Aktivität aufgenommen werden soll (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>

Der Stamm-View muss genau so aussehen, wie er in jedem Layout angezeigt werden soll, dem Sie dieses Layout hinzufügen möchten.

Das <include>-Tag verwenden

Fügen Sie im Layout, dem Sie die wiederverwendbare Komponente hinzufügen möchten, das <include>-Tag hinzu. Hier ist ein Layout, das die Titelleiste aus dem vorherigen Beispiel enthält:

<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>

Sie können auch alle Layoutparameter (alle android:layout_*-Attribute) der Stammansicht des enthaltenen Layouts überschreiben. Dazu geben Sie sie im Tag <include> an. Dies wird im folgenden Beispiel veranschaulicht:

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

Wenn Sie Layoutattribute jedoch mit dem Tag <include> überschreiben möchten, müssen Sie auch android:layout_height und android:layout_width überschreiben, damit die anderen Layoutattribute wirksam werden.

Tag <merge> verwenden

Mit dem <merge>-Tag lassen sich redundante Ansichtsgruppen in der Ansichtshierarchie entfernen, wenn ein Layout in ein anderes aufgenommen wird. Ein Anwendungsfall von <merge> ist, wenn Sie eine benutzerdefinierte Ansicht implementieren, indem Sie ein ViewGroup-Element erweitern.

Wenn Ihr Hauptlayout beispielsweise ein vertikales LinearLayout ist, in dem zwei aufeinanderfolgende Ansichten in mehreren Layouts wiederverwendet werden können, erfordert das wiederverwendbare Layout, in dem Sie die beiden Ansichten platzieren, eine eigene Stammansicht. Die Verwendung eines anderen LinearLayout als Stamm für das wiederverwendbare Layout führt jedoch zu einer vertikalen LinearLayout innerhalb einer vertikalen LinearLayout. Das verschachtelte LinearLayout hat keinen wirklichen Zweck und verlangsamt die Leistung der UI.

Stattdessen können Sie eine LinearLayout erweitern, um eine benutzerdefinierte Ansicht zu erstellen, und eine Layout-XML zum Beschreiben der untergeordneten Ansichten verwenden. Das oberste Tag in der XML-Datei ist <merge> und nicht LinearLayout, wie im folgenden Beispiel gezeigt:

<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>

Wenn Sie dieses Layout mit dem <include>-Tag in ein anderes Layout einfügen, ignoriert das System das <merge>-Element und platziert die beiden Schaltflächen direkt im Layout anstelle des <include>-Tags.

Weitere Informationen zu <include> finden Sie unter Layoutressource.