<merge/>
es útil porque puede deshacerse de ViewGroups innecesarios, es decir, diseños que simplemente se utilizan para ajustar otras vistas y no sirven para nada.
Por ejemplo, si estuviera en <include/>
un diseño desde otro archivo sin usar la combinación, los dos archivos podrían verse así:
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
que es funcionalmente equivalente a este diseño único:
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
Es posible que FrameLayout en layout2.xml no sea útil. <merge/>
Ayuda a deshacerse de él. Esto es lo que parece usar merge (layout1.xml no cambia):
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
Esto es funcionalmente equivalente a este diseño:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
pero como lo está utilizando <include/>
, puede reutilizar el diseño en otro lugar. No tiene que usarse para reemplazar solo FrameLayouts: puede usarlo para reemplazar cualquier diseño que no agregue algo útil a la forma en que se ve / se comporta su vista.
<TextView />
nada más.La etiqueta de inclusión
La
<include>
etiqueta le permite dividir su diseño en varios archivos: ayuda a lidiar con una interfaz de usuario compleja o demasiado larga.Supongamos que divide su diseño complejo utilizando dos archivos de inclusión de la siguiente manera:
top_level_activity.xml :
Entonces necesitas escribir
include1.xml
yinclude2.xml
.Tenga en cuenta que el xml de los archivos de inclusión simplemente se vierte en su
top_level_activity
diseño en el momento del renderizado (muy parecido a la#INCLUDE
macro para C).Los archivos de inclusión son xml de diseño jane simple.
include1.xml :
... e include2.xml :
¿Ver? Nada sofisticado. Tenga en cuenta que aún tiene que declarar el espacio de nombres de Android con
xmlns:android="http://schemas.android.com/apk/res/android
.Entonces, la versión renderizada de top_level_activity.xml es:
En su código java, todo esto es transparente:
findViewById(R.id.textView1)
en su clase de actividad devuelve el widget correcto (incluso si ese widget se declaró en un archivo xml diferente del diseño de la actividad).Y la guinda del pastel: el editor visual maneja la cosa maravillas. El diseño de nivel superior se representa con el xml incluido.
La trama se complica
Como un archivo de inclusión es un archivo xml de diseño clásico, significa que debe tener un elemento superior. Entonces, en caso de que su archivo necesite incluir más de un widget, deberá usar un diseño.
Digamos que
include1.xml
ahora tiene dosTextView
: se debe declarar un diseño. Elijamos aLinearLayout
.include1.xml :
El top_level_activity.xml se representa como:
Pero espera los dos niveles de
LinearLayout
sean redundantes !De hecho, los dos anidados
LinearLayout
no sirven a ningún propósito que los dosTextView
podrían incluirse bajolayout1
para exactamente la misma representación .Entonces, ¿qué podemos hacer?
Ingrese la etiqueta de fusión
los
<merge>
etiqueta es solo una etiqueta ficticia que proporciona un elemento de nivel superior para tratar este tipo de problemas de redundancia.Ahora include1.xml se convierte en:
y ahora top_level_activity.xml se representa como:
Has guardado un nivel de jerarquía, evita una vista inútil: Romain Guy ya duerme mejor.
¿No estás más feliz ahora?
fuente
RelativeLayout
o dibujar las vistas manualmenteBlazeroni ya lo dejó bastante claro, solo quiero agregar algunos puntos.
<merge>
se utiliza para optimizar diseños, se utiliza para reducir la anidación innecesaria.<merge>
etiqueta se agrega a otro diseño, el<merge>
nodo se elimina y su vista secundaria se agrega directamente al nuevo padre.fuente
Para tener un conocimiento más profundo de lo que está sucediendo, creé el siguiente ejemplo. Eche un vistazo a activity_main.xml y content_profile.xml archivos .
activity_main.xml
content_profile.xml
Aquí, todo el archivo de diseño cuando se infla se ve así.
Vea que hay un LinearLayout dentro del LinearLayout padre que no sirve para nada y es redundante. Una mirada al diseño a través de la herramienta Inspector de diseño explica claramente esto.
content_profile.xml después de actualizar el código para usar merge en lugar de un ViewGroup como LinearLayout.
Ahora nuestro diseño se ve así
Aquí vemos que se elimina LinearLayout ViewGroup redundante. Ahora la herramienta Inspector de diseño ofrece la siguiente jerarquía de diseño.
Por lo tanto, siempre intente utilizar la combinación cuando el diseño principal puede posicionar los diseños secundarios, o más precisamente, utilice la combinación cuando comprenda que habrá un grupo de vista redundante en la jerarquía.
fuente
Otra razón para usar la combinación es cuando se usan grupos de vista personalizados en ListViews o GridViews. En lugar de usar el patrón viewHolder en un adaptador de lista, puede usar una vista personalizada. La vista personalizada inflará un xml cuya raíz es una etiqueta de fusión. Código para adaptador:
Aquí está el grupo de vista personalizado:
y aquí está el XML:
fuente