でレイアウトを再利用する

Android ではさまざまなウィジェットが用意されており、小型で再利用できるインタラクティブな要素を提供していますが、特別なレイアウトが必要な大規模コンポーネントの再利用が必要となる場合もあります。レイアウト一式を効率的に再利用するには、<include/> タグと <merge/> タグを使用して、現在のレイアウト内に別のレイアウトを埋め込みます。

再利用できる複雑なレイアウトを作成することが可能なため、レイアウトの再利用は特に効果的です。「はい」または「いいえ」のボタンパネル、または説明テキスト付きのカスタム進行状況バーがその例です。また、複数のレイアウトに共通するアプリケーションの要素を抽出して個別に管理し、各レイアウトに含めることもできます。カスタム View を記述して個々の 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>
    

ルート View は、このレイアウトを追加するレイアウトごとに希望どおりに表示される必要があります。

注: 上記の XML の tools:showIn 属性は特別な属性で、コンパイル中に削除され、Android Studio での設計時にのみ使用されます。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>
    

また、含まれるレイアウトのルートビューにおけるすべてのレイアウト パラメータ(任意の 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 /> タグを使用すると、1 つのレイアウトを別のレイアウトに含める際に、ビュー階層内の冗長なビューグループを削除できます。たとえば、メイン レイアウトが、2 つの連続したビューを複数のレイアウトで再利用可能な垂直の LinearLayout である場合、2 つのビューを配置する再利用可能なレイアウトには、独自のルートビューが必要です。ただし、再利用可能なレイアウトのルートとして別の LinearLayout を使用すると、垂直の LinearLayout 内に垂直の LinearLayout が生じます。LinearLayout のネスト化は、UI パフォーマンスの低下を招くだけです。

このような重複したビューグループが含まれないようにするには、再利用可能なレイアウトのルートビューとして <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/> タグの代わりに 2 つのボタンがレイアウトに直接配置されます。

このトピックに関する詳細については、レイアウト リソースをご覧ください。