<merge/>
est utile car il peut supprimer les ViewGroups inutiles, c'est-à-dire les dispositions qui sont simplement utilisées pour encapsuler d'autres vues et ne servent à rien elles-mêmes.
Par exemple, si vous étiez dans <include/>
une mise en page à partir d'un autre fichier sans utiliser la fusion, les deux fichiers pourraient ressembler à ceci:
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
qui est fonctionnellement équivalent à cette disposition unique:
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
Ce FrameLayout dans layout2.xml peut ne pas être utile. <merge/>
aide à s'en débarrasser. Voici à quoi cela ressemble en utilisant la fusion (layout1.xml ne change pas):
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
Ceci est fonctionnellement équivalent à cette disposition:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
mais puisque vous utilisez, <include/>
vous pouvez réutiliser la mise en page ailleurs. Il ne doit pas être utilisé pour remplacer uniquement FrameLayouts - vous pouvez l'utiliser pour remplacer toute mise en page qui n'ajoute pas quelque chose d'utile à l'apparence / au comportement de votre vue.
<TextView />
rien d'autre.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 :
Ensuite, vous devez écrire
include1.xml
etinclude2.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 :
... et include2.xml :
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:
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 deuxTextView
: une mise en page doit être déclarée. Choisissons unLinearLayout
.include1.xml :
Le top_level_activity.xml sera rendu comme:
Mais attendez que les deux niveaux de
LinearLayout
soient redondants !En effet, les deux imbriqués
LinearLayout
ne servent à rien car les deuxTextView
pourraient être inclus souslayout1
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:
et maintenant top_level_activity.xml est rendu comme:
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?
la source
RelativeLayout
ou dessiner les vues manuellementblazeroni l'a déjà dit assez clairement, je veux juste ajouter quelques points.
<merge>
est utilisé pour optimiser les mises en page. Il est utilisé pour réduire l'imbrication inutile.<merge>
balise est ajoutée dans une autre présentation, le<merge>
nœud est supprimé et sa vue enfant est ajoutée directement au nouveau parent.la source
Pour avoir une connaissance plus approfondie de ce qui se passe, j'ai créé l'exemple suivant. Jetez un œil aux fichiers activity_main.xml et content_profile.xml .
activity_main.xml
content_profile.xml
Ici, le fichier de mise en page entier une fois gonflé ressemble à ceci.
Vérifiez qu'il existe un LinearLayout à l'intérieur du LinearLayout parent qui ne sert à rien et est redondant. Un coup d'œil à la mise en page via l'outil Inspecteur de mise en page l'explique clairement.
content_profile.xml après la mise à jour du code pour utiliser la fusion au lieu d'un ViewGroup comme LinearLayout.
Maintenant, notre disposition ressemble à ceci
Ici, nous voyons que le LinearLayout ViewGroup redondant est supprimé. L'outil Inspecteur de présentation donne maintenant la hiérarchie de présentation suivante.
Essayez donc toujours d'utiliser la fusion lorsque votre disposition parent peut positionner vos dispositions enfant, ou plus précisément d'utiliser la fusion lorsque vous comprenez qu'il va y avoir un groupe de vues redondant dans la hiérarchie.
la source
Une autre raison d'utiliser la fusion est lors de l'utilisation de groupes de vues personnalisés dans ListViews ou GridViews. Au lieu d'utiliser le modèle viewHolder dans un adaptateur de liste, vous pouvez utiliser une vue personnalisée. La vue personnalisée gonflerait un fichier XML dont la racine est une balise de fusion. Code pour l'adaptateur:
voici le groupe de vues personnalisé:
et voici le XML:
la source