La balise include
L' <include>
tag vous permet de diviser votre mise en page dans des fichiers multiples: il permet de traiter avec des complexes ou trop de l'interface utilisateur.
Supposons que vous divisez votre complexe de mise en page à l'aide de deux fichiers à inclure 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 à partir de l'inclure des fichiers est simplement l'objet de dumping dans votre top_level_activity
disposition à temps de rendu (un peu comme l' #INCLUDE
macro pour C).
Les fichiers à inclure sont plaine jane mise en page xml.
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 de fantaisie.
Notez que vous devez toujours déclarer l'android de l'espace de noms avec xmlns:android="http://schemas.android.com/apk/res/android
.
De sorte que le rendu de la version de top_level_activity.xmlest:
<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ée dans un fichier xml différent de l'activité mise en page).
Et la cerise sur le gâteau: l' éditeur visuel gère la chose à merveille. Le haut niveau de la mise en page est rendue avec le xml inclus.
L'intrigue s'épaissit
Comme un fichier include est une disposition classique fichier xml, cela signifie qu'il doit y avoir un élément de plus haut niveau.
Ainsi, dans le cas où votre fichier doit inclure plus d'un widget, vous auriez à utiliser une mise en page.
Disons qu' include1.xml
a maintenant deux TextView
: une mise en page doit être déclaré. Nous allons choisir 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>
L' top_level_activity.xml va être traduit 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 les deux niveaux d' LinearLayout
sont redondants!
En effet, les deux imbriqués LinearLayout
servent à rien comme les deux TextView
pourrait être inclus en vertu de l' layout1
pour exactement le même rendu.
Alors, que pouvons-nous faire?
Entrez la fusion de la balise
L' <merge>
balise est juste un mannequin balise fournit un élément de niveau supérieur pour traiter ce type de redondance des questions.
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 il est traduit 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, d'éviter une inutile vue: Romain Guy dort déjà mieux.
N'êtes-vous pas heureux maintenant?