404 votes

Quel est le but de Android <merge> balise XML mises en page?

J'ai lu Romain Guy post sur l' <merge /> tag, mais je ne comprends toujours pas comment c'est utile. Est-ce une sorte de remplacement de l' <Frame /> balise, ou est-il utilisé comme suit:

<merge xmlns:android="....">
<LinearLayout ...>
    .
    .
    .
</LinearLayout>
</merge>

ensuite, <include /> le code dans un autre fichier?

712voto

blazeroni Points 2317

<merge/> est utile parce qu'il peut se débarrasser des inutiles ViewGroups, c'est à dire les dispositions qui sont simplement utilisés pour envelopper les autres points de vue et ne servent à rien eux-mêmes.

Par exemple, si vous deviez <include/> une mise en page à partir d'un autre fichier sans l'aide de fusionner les deux fichiers pourrait ressembler à quelque chose comme ceci:

layout1.xml:

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

layout2.xml:

<FrameLayout>
   <TextView />
</FrameLayout>

qui est fonctionnellement équivalent à cette seule mise en page:

<FrameLayout>
   <FrameLayout>
      <TextView />
   </FrameLayout>
</FrameLayout>

Que FrameLayout dans layout2.xml ne peut pas être utile. <merge/> aide à se débarrasser de lui. Voici à quoi il ressemble à l'aide de fusion (layout1.xml ne change pas):

layout2.xml:

<merge>
   <TextView />
</merge>

C'est fonctionnellement équivalent à celui de cette disposition:

<FrameLayout>
   <TextView />
</FrameLayout>

mais puisque vous êtes à l'aide de <include/> vous pouvez réutiliser la mise en page d'ailleurs. Il ne doit pas être utilisé pour remplacer seulement FrameLayouts - vous pouvez l'utiliser pour remplacer n'importe quel modèle qui n'est pas d'ajouter quelque chose d'utile à la façon dont votre point de vue sur l'aspect/se comporte.

385voto

Name is carl Points 644

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' layout1pour 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?

37voto

pandit Points 1454

blazeroni déjà il est assez clair, je veux juste ajouter quelques points.

  • <merge> est utilisé pour l'optimisation des mises en page.Il est utilisé pour réduire inutile de nidification.
  • lorsqu'une mise en page contenant <merge> tag est ajouté dans une autre structure,l' <merge> nœud est supprimé et sa vue enfant est ajouté directement à la nouvelle mère.
  • <merge> balise est particulièrement utile avec <include> qui est utilisé pour insérer le contenu d'autres mises en page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X