を使用してレイアウトを再利用する

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 つのボタンがレイアウト内に直接配置されます。

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