A tag de inclusão
A <include>tag permite dividir seu layout em vários arquivos: ajuda a lidar com problemas complexos interface de usuário ou longa.
Suponhamos que você divida seu layout complexo usando dois arquivos de inclusão, como a seguir:
top_level_activity.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<include layout="@layout/include1.xml" />
<!-- Second include file -->
<include layout="@layout/include2.xml" />
</LinearLayout>
Então você precisa escrever include1.xmle include2.xml.
Lembre-se de que o xml dos arquivos de inclusão é simplesmente despejado em seu top_level_activitylayout no momento da renderização (praticamente como a #INCLUDEmacro para C).
Os arquivos de inclusão são xml simples do layout jane.
include1.xml :
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
... e include2.xml :
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button1"
android:text="Button" />
Vejo? Nada chique. Observe que você ainda precisa declarar o namespace do Android com xmlns:android="http://schemas.android.com/apk/res/android.
Portanto, a versão renderizada do top_level_activity.xml é:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
No seu código java, tudo isso é transparente: findViewById(R.id.textView1)na sua classe de atividade retorna o widget correto (mesmo que esse widget tenha sido declarado em um arquivo xml diferente do layout da atividade).
E a cereja no topo: o editor visual lida bem com a coisa. O layout de nível superior é renderizado com o xml incluído.
O enredo engrossa
Como um arquivo de inclusão é um arquivo xml de layout clássico, significa que ele deve ter um elemento superior. Portanto, caso seu arquivo precise incluir mais de um widget, você precisará usar um layout.
Digamos que include1.xmlagora TextViewhaja dois : um layout deve ser declarado. Vamos escolher a LinearLayout.
include1.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
O top_level_activity.xml será renderizado como:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<LinearLayout
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Mas espere que os dois níveis LinearLayoutsejam redundantes !
De fato, os dois aninhados LinearLayoutnão servem para nada, pois os dois TextViewpodem ser incluídos exatamentelayout1 para a mesma renderização .
Então o que nós podemos fazer?
Digite a tag de mesclagem
A <merge>tag é apenas uma tag fictícia que fornece um elemento de nível superior para lidar com esse tipo de problemas de redundância.
Agora include1.xml se torna:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</merge>
e agora top_level_activity.xml é renderizado como:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Você salvou um nível de hierarquia, evita uma visão inútil: o Romain Guy já dorme melhor.
Você não está mais feliz agora?
<TextView />, nada mais.