change android android-layout merge include android-relativelayout

android - change - ¿Cómo hacer RelativeLayout trabajando con merge e include?



change include layout android (7)

Los atributos android: layout_ * parecen ignorarse cuando se usan en la etiqueta include y todos los diseños combinados se muestran uno encima del otro.

Supongo que no puede hacer referencia, desde las reglas de diseño, los atributos de android:id que están definidos en los elementos <include> , solo los que están en widgets y contenedores "reales".

Además, si alguien puede pensar en una forma para que yo solo tenga un archivo de distribución de xml de fusión en lugar de 5, sería muy apreciado.

Simple: ponerlos todos en un solo archivo.

No pude encontrar una manera de hacerlo porque necesito tener acceso a cada elemento en los archivos de diseño de fusión en tiempo de ejecución

Ya sea que tenga un elemento <include> o 1,000, todos los contenidos deberían estar accesibles en tiempo de ejecución. Una excepción es si tiene atributos duplicados de android:id . findViewById() correctamente las llamadas a findViewById() para obtener la correcta, al igual que cuando obtiene widgets de una fila de ListView.

Si puede crear un proyecto de muestra que utiliza 2+ archivos de fusión donde puede demostrar que los contenidos no son accesibles en tiempo de ejecución, hágamelo saber.

Hace algunos días que intento hacer que mis diseños sean más eficientes mediante la conversión de varios niveles de LinearLayouts anidados a un RelativeLayout y me he encontrado con algunos problemas que no he podido encontrar para solucionarlos ...

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 merge e incluir etiquetas. Entonces, lo que tengo es un archivo de diseño principal con un elemento raíz RelativeLayout . Dentro de eso tengo 5 etiquetas de inclusión que hacen referencia a 5 archivos diferentes de diseño xml que tienen cada uno un elemento de fusión para la raíz (todos mis archivos de combinación son iguales excepto para los identificadores).

Me encuentro con dos problemas, que explicaré después de publicar una versión simplificada de mi código de diseño:

Muestra 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>

Muestra incluido archivo de fusión:

<?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 atributos android:layout_* parecen ignorarse cuando se usan en la etiqueta include y todos los diseños combinados se muestran uno encima del otro. De acuerdo con esta publicación ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) "cualquier atributo de android:layout_* se puede usar con la etiqueta <include /> "

2) Como no podía hacer funcionar esto, decidí intentar agregar un atributo android:layout_below al primer elemento TextView en cada archivo de diseño de fusión, lo que significa que cada archivo de fusión haría referencia a un id de otro archivo de diseño de fusión ... Para la mayor parte esto realmente funcionó y mi diseño se ve bien. Sin embargo, android:layout_below un error en uno de los atributos de android:layout_below que dice que no puede encontrar el ID que especifiqué ... He verificado los identificadores doble y triple para asegurarme de que eran correctos. La parte más extraña es que utilicé la función AutoFill 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 probarlos. Además, si alguien puede pensar en una forma para que yo solo tenga un archivo de distribución de xml de fusión 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 fusión en tiempo de ejecución ...


En mi caso, el diseño que estaba tratando de incluir comienza con <merge tag. Cuando lo cambié a un diseño, di <RelativeLayout funcionó. A continuación está la ilustración.

TRABAJANDO

<RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home">

NO FUNCIONA

<merge xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home">


Hay un problema con la etiqueta de inclusión. Compruebe: https://issuetracker.google.com/issues/36908001

Para solucionarlo, asegúrese de sobrescribir tanto layout_width como layout_height cuando lo incluya, de lo contrario, todo se ignorará.


Hombre, esto es viejo, pero parece estar en la parte superior de las búsquedas, así que voy a comentar.

Creo que el truco aquí es que la etiqueta <merge> combinada con la etiqueta <include> esencialmente elimina cualquier tipo de grupo de vista "padre" en ese nivel. Entonces, ¿a quién le estás pidiendo exactamente "layout_below" a alguien más? Ninguno. No hay vista en ese nivel.

La etiqueta <merge> toma las vistas secundarias y las muestra directamente en el elemento primario de la etiqueta <include> . Por lo tanto, debe pedirles a los niños en el diseño que están incluyendo que se anclen en consecuencia.


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

<RelativeLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content"> .... </RelativeLayout> <RelativeLayout android:id="@+id/footer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> ..... </RelativeLayout> <include layout="@layout/content_layout" />

content_layout.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/footer" android:layout_below="@id/header" > .... </RelativeLayout> </merge>

Obviamente, esto no es lo que queremos los desarrolladores, pero es la única solución que he encontrado para evitar duplicar xml


Tuve el mismo problema e incluso definir layout_width y layout_height no funcionó. El problema era que el diseño que estaba incluyendo tenía etiquetas y, después de eliminarlas, todo funcionaba como un amuleto. Supongo que la fusión no es una etiqueta de diseño y, debido a eso, no puede recibir parámetros de posicionamiento y tamaño. Como todo lo que define se transfiere al diseño padre interno, la configuración simplemente se descartó.

TL: DR: simplemente elimine las etiquetas, mueva las definiciones de xmlns a un visualizador de diseño real y debería estar bien.

Antes de:

<merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <...ui.component.BorderCardView android:layout_width="112dp" android:layout_height="32dp" app:cardCornerRadius="4dp" app:cardUseCompatPadding="true"> <ImageView android:layout_width="16dp" android:layout_height="16dp" android:src="@drawable/ic_logout" android:tint="@color/divider" /> </...ui.component.BorderCardView> </merge>

Trabajando:

<...ui.component.BorderCardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="112dp" android:layout_height="32dp" app:cardCornerRadius="4dp" app:cardUseCompatPadding="true"> <ImageView android:layout_width="16dp" android:layout_height="16dp" android:src="@drawable/ic_logout" android:tint="@color/divider" /> </...ui.component.BorderCardView>


Vea la respuesta más votada a continuación. El mío está lamentablemente desactualizado

Puedo abordar un problema que Justin planteó: la incapacidad de RelativeLayout para administrar el posicionamiento de una inclusión (al menos en este caso simple, en un emulador de 1.6)

CommonsWare sugiere incluir las inclusiones en un contenedor principal único, pero lo hace para ayudar a abordar y determinar el alcance de las vistas de idéntico nombre dentro de Justin.

Cada uno tendría que tener un contenedor primario único, y llamaría a findViewById () en ese contenedor (ViewGroup) en lugar de a la Actividad.

De hecho, también debe hacerlo para que RelativeLayout se comporte como se esperaba:

Esto funciona (el pie de página está bien posicionado):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignParentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_parent" android:focusable="false" /> <LinearLayout android:layout_alignParentBottom="true" android:layout_height="wrap_content" android:layout_width="fill_parent"> <include android:id="@+id/footer" layout="@layout/footer" /> </LinearLayout> </RelativeLayout>

Esto no (el pie de página está flotando en la parte superior de la pantalla):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignParentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_parent" android:focusable="false" /> <include android:id="@+id/footer" layout="@layout/footer" android:layout_alignParentBottom="true" /> </RelativeLayout>

El pie de página desnudo no se alineará con la parte inferior del elemento principal, sin el LinearLayout circundante. No llamaría a este comportamiento esperado.

Además, el WebView parece unirse 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 traté de establecer un botón justo encima del pie de página include, pero también se puso floaty e incorrecto

RelativeLayout tuvo más problemas en 1.5, pero todavía me gusta :)