He estado intentando durante unos días hacer que mis diseños sean más eficientes al convertir el uso de varios niveles de anidados LinearLayouts
en uno RelativeLayout
y me he encontrado con algunos problemas para los que no he podido encontrar una solución alternativa ...
He buscado en el grupo de principiantes de Android y en este sitio y no he podido encontrar nada que me ayude a resolver el problema.
Leí en uno de los blogs que puedes combinar diseños con combinar e incluir etiquetas. Entonces, lo que tengo es un archivo de diseño principal con un RelativeLayout
elemento raíz. Dentro de eso, tengo 5 etiquetas de inclusión que hacen referencia a 5 archivos de diseño xml diferentes, cada uno de los cuales tiene un elemento de combinación para la raíz (todos mis archivos de combinación son iguales, excepto por los ID que contienen).
Me encuentro con dos problemas, que explicaré después de publicar una versión simplificada de mi código de diseño:
Ejemplo de archivo de diseño principal:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/translucent_gray" >
<include
android:id="@+id/running_gallery_layout_id"
layout="@layout/running_gallery_layout" />
<include
android:id="@+id/recent_gallery_layout_id"
layout="@layout/recent_gallery_layout"
android:layout_below="@id/running_gallery_layout_id" />
<include
android:id="@+id/service_gallery_layout_id"
layout="@layout/service_gallery_layout"
android:layout_below="@id/recent_gallery_layout_id" />
<include
android:id="@+id/process_gallery_layout_id"
layout="@layout/process_gallery_layout"
android:layout_below="@id/service_gallery_layout_id" />
</RelativeLayout>
Ejemplo de archivo de combinación incluido:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
style="@style/TitleText"
android:id="@+id/service_gallery_title_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="@string/service_title" />
<Gallery
android:id="@+id/service_gallery_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_below="@id/service_gallery_title_text_id" />
<TextView
style="@style/SubTitleText"
android:id="@+id/service_gallery_current_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/service_gallery_title_text_id"
android:layout_above="@id/service_gallery_id" />
</merge>
Me encuentro con dos problemas:
1) Los android:layout_*
atributos parecen ignorarse cuando se usan en la etiqueta de inclusión y todos los diseños combinados se muestran uno encima del otro. Según esta publicación ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) " android:layout_*
se puede usar cualquier atributo con la <include />
etiqueta"
2) Como no pude hacer que esto funcionara, decidí intentar agregar un android:layout_below
atributo al primer TextView
elemento en cada archivo de diseño de combinación, lo que significa que cada archivo de combinación haría referencia a una identificación de otro archivo de diseño de combinación ... En su mayor parte, esto realmente funcionó y mi diseño se ve bien. Sin embargo, aparece un error en uno de los android:layout_below
atributos que dice que no puede encontrar la identificación que especifiqué ... He verificado dos y tres veces las identificaciones para asegurarme de que sean correctas. La parte más extraña es que utilicé la AutoFill
función para poner la identificación en el atributo en primer lugar.
Si alguien tiene alguna sugerencia o solución alternativa, estaré más que feliz de probarlas. Además, si alguien puede pensar en una manera de tener un solo archivo de diseño xml combinado en lugar de 5, sería muy apreciado. No pude encontrar una manera de hacerlo porque necesito tener acceso a cada elemento en los archivos de diseño de combinación en tiempo de ejecución ...
layout_width
y me helayout_height
fijado en mi<include>
. Traté también de montarlayout_width
ylayout_height
en mi<merge>
pero sin éxito. Qué me estoy perdiendo ?Vea la respuesta más votada a continuación. El mío está lamentablemente desactualizado
Puedo abordar un problema que planteó Justin : incapacidad de RelativeLayout para administrar el posicionamiento de una inclusión (al menos en este caso simple, en un emulador 1.6)
CommonsWare sugiere envolver la incluye en un único contenedor principal, pero lo hace con el fin de ayudar a hacer frente a la determinación del alcance y con nombres idénticos puntos de vista dentro de Justin incluye
De hecho, también debe hacerlo para que RelativeLayout se comporte como se espera:
Esto funciona (el pie de página está bien posicionado):
Esto no (el pie de página flota en la parte superior de la pantalla):
La inclusión de pie de página desnudo no se alineará con la parte inferior del padre, sin el LinearLayout circundante. No llamaría a este comportamiento esperado.
Además, WebView parece adjuntarse muy bien al encabezado por ID, pero creo que esto es una ilusión, debido a que simplemente fluye debajo del encabezado verticalmente. También intenté establecer un botón justo encima del pie de página, pero también se volvió flotante e incorrecto.
RelativeLayout tuvo más problemas en 1.5, pero todavía me gusta :)
fuente
Hombre, esto es antiguo, pero parece aparecer en la parte superior de las búsquedas, así que voy a comentar.
Creo que el truco aquí es que la
<merge>
etiqueta combinada con la<include>
etiqueta esencialmente elimina cualquier tipo de grupo de vista "principal" en ese nivel. Entonces, ¿a quién le estás preguntando exactamente para "layout_below" a otra persona? Ninguno. No hay vista a ese nivel.La
<merge>
etiqueta toma las vistas secundarias y las coloca directamente en el padre de la<include>
etiqueta. Por lo tanto, debe pedir a los niños del diseño que incluye que se anclen en consecuencia.fuente
Para que el posicionamiento funcione en RelativeLayout, debe establecer los parámetros layout_ * en el archivo de inclusión, no en el archivo de diseño principal. De esa manera
main_layout.xml
content_layout.xml
Obviamente, esto no es lo que queremos los desarrolladores, pero es la única solución que he encontrado para evitar duplicar xml
fuente
Supongo que no se puede hacer referencia, desde las reglas de diseño, a
android:id
atributos que están definidos en<include>
elementos, solo a los que están en widgets y contenedores "reales".Simple: ponlos todos en un archivo.
Ya sea que tenga un
<include>
elemento o 1,000, todos los contenidos deben ser accesibles en tiempo de ejecución. Una excepción es si tieneandroid:id
atributos duplicados : necesitaría ajustar correctamente el alcance de susfindViewById()
llamadas para obtener la correcta, tal como debe hacerlo cuando obtiene widgets de una fila de ListView.Si puede crear un proyecto de muestra que use más de 2 archivos de combinación en los que pueda demostrar que no se puede acceder al contenido en tiempo de ejecución, hágamelo saber.
fuente
tratar :
fuente
En mi caso, el diseño que intentaba incluir comienza con
<merge
etiqueta. Cuando lo cambié a un diseño, digo<RelativeLayout
que funcionó. A continuación se muestra la ilustración.TRABAJANDO
NO FUNCIONA
fuente
Tuve el mismo problema e incluso definiendo
layout_width
ylayout_height
no funcionó. El problema era que el diseño que estaba incluyendo tenía etiquetas y, después de quitarlas, todo funcionó a la perfección. Supongo que la combinación no es una etiqueta de diseño y, por eso, no puede recibir parámetros de tamaño y posicionamiento. Dado que todo lo que define en se transfiere al diseño principal interno, la configuración simplemente se desechó.TL: DR: Simplemente elimine las etiquetas, mueva las definiciones xmlns a un marcador de visualización de diseño real y debería estar bien.
Antes de:
Trabajando:
fuente