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 :
<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>
Entonces necesitas escribir include1.xml
y include2.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 :
<?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"/>
... e 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" />
¿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:
<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>
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 dos TextView
: se debe declarar un diseño. Elijamos a 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>
El top_level_activity.xml se representa como:
<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>
Pero espera los dos niveles de LinearLayout
sean redundantes !
De hecho, los dos anidados LinearLayout
no sirven a ningún propósito que los dos TextView
podrían incluirse bajo layout1
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:
<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>
y ahora top_level_activity.xml se representa como:
<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>
Has guardado un nivel de jerarquía, evita una vista inútil: Romain Guy ya duerme mejor.
¿No estás más feliz ahora?
<TextView />
nada más.