¿Cuál es el propósito de la etiqueta de Android en los diseños XML?

He leído la publicación de Romain Guy en la etiqueta , pero todavía no entiendo cómo es útil. ¿Es una especie de reemplazo de la etiqueta , o se usa así:

   . . .   

luego el código en otro archivo?

es útil porque puede deshacerse de ViewGroups innecesarios, es decir, diseños que simplemente se usan para ajustar otras vistas y que no sirven para nada.

Por ejemplo, si tuviera que un diseño de otro archivo sin utilizar fusionar, los dos archivos podrían tener un aspecto similar a este:

layout1.xml:

    

layout2.xml:

    

que es funcionalmente equivalente a este diseño único:

      

Es posible que FrameLayout en layout2.xml no sea útil. ayuda a deshacerse de él. Esto es lo que parece usar merge (layout1.xml no cambia):

layout2.xml:

    

Esto es funcionalmente equivalente a este diseño:

    

pero como usa puede reutilizar el diseño en otro lugar. No tiene que ser utilizado para reemplazar solamente FrameLayouts: puede usarlo para reemplazar cualquier diseño que no agregue algo útil a la apariencia o el comportamiento de su vista.

La etiqueta de inclusión

La etiqueta permite dividir su diseño en varios archivos: ayuda a manejar 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 :

       

Luego debe escribir include1.xml e include2.xml .

Tenga en cuenta que el xml de los archivos de inclusión simplemente se descarga en su diseño top_level_activity en el momento de la renderización (más o menos como la macro #INCLUDE para C).

Los archivos incluidos son plain jane layout xml.

include1.xml :

   

… e include2.xml :

   

¿Ver? Nada sofisticado. Tenga en cuenta que todavía 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 fue declarado en un archivo xml diferente del diseño de la actividad).

Y la cereza en la parte superior: el editor visual maneja la cosa maravillosamente. El diseño de nivel superior se representa con el xml incluido.

La ttwig 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ía usar un diseño.

Digamos que include1.xml ahora tiene dos TextView : se debe declarar un diseño. LinearLayout un LinearLayout .

include1.xml :

     

Top_level_activity.xml se representará como:

          

¡Pero espere que los dos niveles de LinearLayout sean redundantes !

De hecho, los dos LinearLayout nesteds no sirven para nada, ya que los dos TextView podrían incluirse en layout1 para obtener exactamente la misma representación .

Entonces, ¿qué podemos hacer?

Ingrese la etiqueta de fusión

La 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:

        

Guardaste un nivel de jerarquía, evitaste una vista inútil: Romain Guy ya duerme mejor.

¿No estás más feliz ahora?

En palabras simples y precisas,

Cuando se agrega un diseño que contiene una etiqueta de fusión a otro diseño, el nodo de combinación se elimina y sus Vistas secundarias se agregan directamente al nuevo elemento primario.

La etiqueta merge es particularmente útil junto con la include tag , que se usa para insertar el contenido de una presentación en otra.

Ejemplo

      

blazeroni ya lo dejó bastante claro, solo quiero agregar algunos puntos.

  • se usa para optimizar diseños. Se usa para reducir el anidamiento innecesario.
  • cuando un diseño que contiene la etiqueta se agrega a otro diseño, el nodo se elimina y su vista secundaria se agrega directamente al nuevo elemento primario.
  • etiqueta es particularmente útil con que se usa para insertar el contenido de otro diseño.

Otro motivo para usar la combinación es cuando se usan grupos de vista personalizados en ListViews o GridViews. En lugar de utilizar el patrón viewHolder en un adaptador de lista, puede usar una vista personalizada. La vista personalizada inflaría un xml cuya raíz es una etiqueta de fusión. Código para el adaptador:

 public class GridViewAdapter extends BaseAdapter { // ... typical Adapter class methods @Override public View getView(int position, View convertView, ViewGroup parent) { WallpaperView wallpaperView; if (convertView == null) wallpaperView = new WallpaperView(activity); else wallpaperView = (WallpaperView) convertView; wallpaperView.loadWallpaper(wallpapers.get(position), imageWidth); return wallpaperView; } } 

aquí está el grupo de vista personalizado:

 public class WallpaperView extends RelativeLayout { public WallpaperView(Context context) { super(context); init(context); } // ... typical constructors private void init(Context context) { View.inflate(context, R.layout.wallpaper_item, this); imageLoader = AppController.getInstance().getImageLoader(); imagePlaceHolder = (ImageView) findViewById(R.id.imgLoader2); thumbnail = (NetworkImageView) findViewById(R.id.thumbnail2); thumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP); } public void loadWallpaper(Wallpaper wallpaper, int imageWidth) { // ...some logic that sets the views } } 

y aquí está el XML:

     

Para tener un conocimiento más profundo de lo que está sucediendo, creé el siguiente ejemplo. Eche un vistazo a los archivos activity_main.xml y content_profile.xml .

activity_main.xml

    

content_profile.xml

     

Aquí, el archivo de diseño completo cuando está inflado se ve así.

       

Ver que hay un LinearLayout dentro del LinearLayout padre que no sirve para ningún propósito y es redundante. Un vistazo al diseño a través de la herramienta Inspector de diseño explica esto claramente.

enter image description here

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 el LinearLayout ViewGroup redundante se elimina. Ahora la herramienta Inspector de diseño proporciona la siguiente jerarquía de diseño.

enter image description here

Por lo tanto, siempre intente utilizar merge cuando su diseño principal pueda ubicar sus diseños secundarios o, más precisamente, use merge cuando comprenda que va a haber un grupo de vistas redundante en la jerarquía.