La balise include
La <include>
balise vous permet de diviser votre mise en page en plusieurs fichiers: elle permet de gérer une interface utilisateur complexe ou trop longue.
Supposons que vous divisiez votre mise en page complexe à l'aide de deux fichiers d'inclusion comme suit:
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>
Ensuite, vous devez écrire include1.xml
et include2.xml
.
Gardez à l'esprit que le xml des fichiers inclus est simplement vidé dans votre top_level_activity
mise en page au moment du rendu (un peu comme la #INCLUDE
macro pour C).
Les fichiers d'inclusion sont des fichiers XML de mise en page plain 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"/>
... et 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" />
Voir? Rien d'extraordinaire. Notez que vous devez toujours déclarer l'espace de noms Android avec xmlns:android="http://schemas.android.com/apk/res/android
.
La version rendue de top_level_activity.xml est donc:
<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>
Dans votre code java, tout cela est transparent: findViewById(R.id.textView1)
dans votre classe d'activité retourne le widget correct (même si ce widget a été déclaré dans un fichier xml différent de la mise en page de l'activité).
Et la cerise sur le gâteau: l' éditeur visuel gère la chose avec nage. La disposition de niveau supérieur est rendue avec le xml inclus.
L'intrigue se corse
Comme un fichier inclus est un fichier xml de mise en page classique, cela signifie qu'il doit avoir un élément supérieur. Donc, si votre fichier doit inclure plus d'un widget, vous devrez utiliser une mise en page.
Disons qu'il en include1.xml
a maintenant deux TextView
: une mise en page doit être déclarée. Choisissons un 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>
Le top_level_activity.xml sera rendu comme:
<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>
Mais attendez que les deux niveaux de LinearLayout
soient redondants !
En effet, les deux imbriqués LinearLayout
ne servent à rien car les deux TextView
pourraient être inclus sous layout1
pour exactement le même rendu .
Alors, que pouvons-nous faire?
Entrez la balise de fusion
La <merge>
balise est juste une balise factice qui fournit un élément de niveau supérieur pour faire face à ce type de problèmes de redondance.
Maintenant, include1.xml devient:
<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>
et maintenant top_level_activity.xml est rendu comme:
<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>
Vous avez enregistré un niveau de hiérarchie, évitez une vue inutile: Romain Guy dort déjà mieux.
N'êtes-vous pas plus heureux maintenant?
<TextView />
rien d'autre.