Pregunta

he estado tratando durante unos días ahora para hacer mis diseños más eficiente mediante la conversión del uso de varios niveles de LinearLayouts anidada a una RelativeLayout y han llegado a través de algunos problemas que no he de no haber sido capaz de encontrar una solución para .. .

He buscado el grupo de principiantes Android y este sitio y no han sido capaces de encontrar cualquier cosa que ayudaría a resolver el problema.

He leído en uno de los blogs que se pueden combinar con los diseños de mezcla e incluir las etiquetas. Así que lo que tenemos es un archivo principal de diseño con un elemento raíz RelativeLayout. Dentro de ese Tengo 5 incluyen las etiquetas que la referencia 5 distintos archivos de diseño XML que tienen cada uno un elemento de combinación de la raíz (todos mis archivos de combinación son los mismos a excepción de los identificadores en ellos).

Estoy corriendo en 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>

muestra incluyó la fusión del archivo:

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

Estoy corriendo en dos problemas:

1) El android:layout_* atributos parecen ser ignorada cuando se utiliza en la etiqueta include y todos los diseños fusionadas se muestran en la parte superior de uno al otro. De acuerdo con este post ( http://developer.android.com/resources/ artículos / esquemas de trucos-reuse.html ) "cualquier atributo android:layout_* se pueden utilizar con la etiqueta <include />"

2) Como no podía conseguir este trabajo decidí intentar añadir un atributo android:layout_below al primer elemento TextView en cada archivo de diseño de mezcla, lo que significa que cada archivo de combinación estaría refiriendo a un id de otro archivo de diseño de combinación ... En su mayor parte, esto no funcionaba y mi diseño se ve bien. Sin embargo, me sale un error en uno de los atributos android:layout_below diciendo que no puede encontrar el ID he especificado ... Tengo doble y triple comprobado los identificadores para asegurarse de que eran correctos. Lo más extraño es que he utilizado la función AutoFill para poner el id en el atributo en el primer lugar.

Si alguien tiene alguna sugerencia o soluciones estaré más que feliz de probarlos. Además, si alguien puede pensar en una manera para mí Sólo tengo una combinación de archivo de diseño de XML en lugar de 5, que sería muy apreciada. No pude encontrar una manera de hacer eso porque necesito tener acceso a cada elemento en los archivos de diseño de mezcla en tiempo de ejecución ...

¿Fue útil?

Solución

Hay un problema con la etiqueta include. Comprobar: https://issuetracker.google.com/issues/36908001

Para solucionarlo, asegúrese de que las anule AMBOS layout_width y layout_height cuando se incluye, por lo demás todo será ignorado.

Otros consejos

Ver más altamente votado respuesta a continuación. La mía no está actualizado lamentablemente


i puede abordar un problema Justin planteado: incapacidad de RelativeLayout para gestionar el posicionamiento de un incluyen (al menos en este caso sencillo, en un emulador de 1,6)

CommonsWare sugiere envolver la incluye en un único contenedor primario, sino que lo hace con el fin de ayudar a hacer frente a la determinación del alcance y con nombres idénticos Vistas dentro de de Justin incluye

  

Cada uno de ellos tiene que tener una   contenedor primario único, y lo haría   llamar findViewById () en ese contenedor   (ViewGroup) en lugar de en el   La actividad.

De hecho, también debe hacerlo con el fin de obtener RelativeLayout comportarse como se espera:

Este obras ( pie de página está bien posicionada):

<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 lo hace ( 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 desnudo pie de página incluir no alineará a fondo de los padres, sin el LinearLayout rodea .. Yo no diría que este comportamiento esperado.

Además, el WebView parece adherirse muy bien a la cabecera por ID, pero yo creo que esto es ilusión, debido a que simplemente fluye por debajo de la cabecera verticalmente. También probé a configurar un botón de la derecha sobre el pie de página incluyen, pero tengo todo el vaporoso y el mal, también

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

Hombre, esto es viejo, pero parece que llegar a la parte superior de las búsquedas, por lo que voy a hacer comentarios.

Creo que el truco aquí es que la etiqueta <merge> combinado con la etiqueta <include> eliminar esencialmente cualquier tipo de "padre" grupo de la vista a ese nivel. Así pues, que es exactamente lo que pide a alguien "layout_below" otro sitio? Ninguno. No hay vistas a ese nivel.

La etiqueta <merge> toma el punto de vista del niño y les aparece a la derecha en el padre de la etiqueta <include>. Por lo tanto, usted debe preguntar a los niños en el diseño que está incluida en el ancla en consecuencia.

Para posicionar a trabajar en RelativeLayout que hay que configurar el layout_ * parámetros en el archivo de inclusión, no en el archivo principal de diseño. 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>

Esto obviamente no es lo que nosotros los desarrolladores quieren, pero es la única solución que he encontrado para evitar la duplicación de XML

  

El androide: layout_ atributos parecen *   para ser ignorado cuando se utiliza en la incluyen   etiqueta y todos los diseños son fusionadas   se muestra en la parte superior de la otra.

Mi conjetura es que se puede hacer referencia, de las reglas de diseño, los atributos android:id que se definen en los elementos <include>, únicos que están en widgets "reales" y contenedores.

  

Además, si alguien puede pensar en una forma de   yo sólo tengo una combinación de diseño xml   archivo en lugar de 5, que sería   muy apreciado.

simple: poner a todos en un solo archivo

.
  

No podría encontrar una manera de hacerlo   porque necesitan tener acceso a cada   elemento de la combinación de archivos a la Disposición del   tiempo de ejecución

Si usted tiene un elemento <include> o 1000, la totalidad del contenido debe ser accesible en tiempo de ejecución. Una excepción es si usted tiene atributos android:id duplicados -. Que tendría que alcance adecuadamente sus llamadas findViewById() para conseguir la correcta, al igual que usted tiene que conseguir cuando widgets de una fila ListView

Si usted puede crear un proyecto de ejemplo que utiliza 2+ archivos de combinación en la que pueden demostrar que el contenido es no acceso en tiempo de ejecución, que me haga saber.

En mi caso, la disposición que yo estaba tratando de incluir comienza con la etiqueta <merge. Cuando me cambié a un diseño, por ejemplo <RelativeLayout funcionó. A continuación se muestra la ilustración.

TRABAJO

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

NO TRABAJO

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

Yo tenía el mismo problema e incluso definir layout_width y layout_height no funcionó. El problema era que el diseño estaba incluyendo etiquetas tenido y después de la eliminación de ellos, todo funcionó a las mil maravillas. Supongo que la fusión no es una etiqueta de diseño y debido a eso, no puede recibir parámetros de posición y tamaño. Ya que todo se define en se transfiere a la disposición de los padres interno, los ajustes eran simplemente tirar.

TL: DR:. Basta con retirar las etiquetas, mover las definiciones xmlns a un verdadero viewholder disposición y usted debe ser bueno

Antes:

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

Trabajo:

<...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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top