Reutilizar layouts com <include>

Embora o Android ofereça uma variedade de widgets para fornecer elementos pequenos, reutilizáveis e interativos, também pode ser necessário reutilizar componentes maiores que exigem um layout especial. Para reutilizar com eficiência layouts completos, use as tags <include> e <merge> para incorporar um layout dentro de outro.

Isso permite que você crie layouts complexos, como um painel de botões "sim" ou "não" ou um painel de progresso personalizado barra com texto de descrição. E isso significa que é possível extrair todos os elementos do aplicativo que são comuns em vários layouts, gerencie-os separadamente e inclua-os em cada layout. é possível criar componentes de IU individuais gravando View, faça isso mais facilmente reutilizar um arquivo de layout.

Criar um layout reutilizável

Comece criando um novo arquivo XML e definindo o layout que você quer reutilizar. Para exemplo, aqui está um layout que define uma barra de título para incluir em cada atividade (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>

A View raiz precisa ser exatamente como você quer que ela apareça em cada ao qual você planeja adicionar esse layout.

Usar a tag <include>

Dentro do layout em que você quer adicionar o componente reutilizável, adicione o <include>. Por exemplo, aqui está um layout que inclui a barra de título de no exemplo anterior:

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

Também é possível substituir todos os parâmetros de layout, qualquer android:layout_* atributos da visualização raiz do layout incluído, especificando-os no elemento <include>. Isso é mostrado neste exemplo:

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

No entanto, se você quiser modificar os atributos de layout usando a tag <include>, também vai substituir android:layout_height e android:layout_width para tornar outros atributos de layout entram em vigor.

Usar a tag <merge>

A tag <merge> ajuda a eliminar grupos de visualizações redundantes da sua hierarquia ao incluir um layout dentro de outro. Um caso de uso de <merge> é quando você implementar uma visualização personalizada estendendo uma ViewGroup.

Por exemplo, se o layout principal for um vertical LinearLayout em que duas visualizações consecutivas podem ser reutilizadas em vários layouts. Depois, no layout reutilizável, duas visualizações precisam da própria visualização raiz. No entanto, usar outro LinearLayout como raiz do layout reutilizável resulta em uma LinearLayout vertical dentro de uma LinearLayout: O LinearLayout aninhado não serve a propósito real e fica lento o desempenho da interface.

Em vez disso, você pode estender um LinearLayout para criar uma visualização personalizada e usar um XML de layout. para descrever as visualizações filhas. A tag superior no XML é <merge>, em vez de LinearLayout, conforme mostrado no exemplo a seguir:

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

Quando você inclui esse layout em outro, usando o <include> tag: o sistema ignora o elemento <merge> e coloca os dois botões diretamente no layout, no lugar da tag <include>.

Para mais informações sobre <include>, consulte Recurso de layout.