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.xml
e include2.xml
.
Lembre-se de que o xml dos arquivos de inclusão é simplesmente despejado em seu top_level_activity
layout no momento da renderização (praticamente como a #INCLUDE
macro 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.xml
agora TextView
haja 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 LinearLayout
sejam redundantes !
De fato, os dois aninhados LinearLayout
não servem para nada, pois os dois TextView
podem 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.