Vista previa de diseño con combinación de etiqueta raíz en Intellij IDEA / Android Studio

158

Imaginemos que estamos desarrollando un componente compuesto basado en LinearLayout. Entonces, creamos una clase como esta:

public class SomeView extends LinearLayout {
    public SomeView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(LinearLayout.VERTICAL);
        View.inflate(context, R.layout.somelayout, this);
    }
}

Si usaremos LinearLayoutcomo raíz de somelayout.xml, tendremos un nivel de vista adicional, por lo que usaremos la etiqueta merge:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some other text"/>
</merge>

Pero en la pestaña Vista previa en la fusión IDE siempre actúa como FrameLayout, y veremos algo así: Vista previa con fusión

(Es Android Studio, Intellij IDEA es lo mismo, sobre Eclipse, no lo sé)

La vista previa acelera mucho los diseños en desarrollo, es triste perder una gran ayuda incluso para algunos diseños. Puede haber una manera de especificar, ¿cómo Vista previa debe interpretar la mergeetiqueta en un diseño particular?

darja
fuente
1
Me gustaría ver este soporte agregado también.
Christopher Perry
Esto podría resolverse en algún momento en el futuro mediante el atributo de herramientas. code.google.com/p/android/issues/detail?id=61652
Jonas

Respuestas:

352

Hay un nuevo atributo de herramientas parentTag ( agregado en Android Studio 2.2 ) que puede usar para especificar el tipo de diseño para una etiqueta de fusión, lo que hará que el diseño se procese correctamente en la vista previa del editor de diseño.

Entonces, usando tu ejemplo:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:parentTag="LinearLayout"
    tools:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some other text"/>
</merge>

Nota : Ambos android:layout_widthy android:layout_heightdeben especificarse para que el diseño se muestre correctamente en el editor.

starkej2
fuente
1
¿Alguien sabe cómo mostrar la vista previa correctamente cuando agrega su etiqueta de vista personalizada en otro archivo de diseño? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Primero
2
Como está utilizando herramientas, también podría usar herramientas: layout_height = "match_parent"
cutiko
¡Perfecto! Gracias. +1
Carson J.
66

Editar: respuesta desactualizada. Ver la respuesta de starkej2.


Android Studio 0.5.8 agregó soporte para herramientas: showIn. Al usarlo, es posible obtener una vista previa de los diseños de <fusión>.

http://tools.android.com/recent/androidstudio058released

layout / layout_merge.xml con herramientas: showIn:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   tools:showIn="@layout/simple_relativelayout">

......

</merge>

layout / simple_relativelayout.xml con include:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/layout_merge"/>

</RelativeLayout>
Jonas
fuente
14
¡Buenas noticias! No es muy útil para componentes compuestos, porque necesitamos agregar un diseño adicional solo para la vista previa. Pero mejor que nada.
darja
¿Alguna idea sobre algo similar es compatible con Eclipse?
Toguard
3
Puede seguir un ticket, informado por un desarrollador de Google aquí: code.google.com/p/android/issues/detail?id=61652
Neige
Establecí algunos atributos en la vista raíz (en este caso, RelativeLayout) mediante programación, como el relleno. Por supuesto, no se aplican en este diseño auxiliar (porque usa una vista completamente diferente). La única solución era usar toda la vista personalizada en el diseño auxiliar.
Felix Edelmann
no está desactualizado, podría usarse cuando no desee una visualización genérica
amorenew
-5

También es posible usar la clase personalizada como padre en lugar de fusionar como

<com.mycompany.SomeView xmlns:android="http://schemas.android.com/apk/res/android">
...
</com.mycompany.SomeView>

Y luego inflar directamente este diseño y emitir la vista de resultados a SomeView. Android Studio verificará directamente la clase principal de SomeViewy manejará la vista previa como LinerLayout. Puede usar el onFinishInflate()método en SomeViewpara enlazar vistas por findViewById(). El beneficio de esta solución es que puede poner todas las definiciones de diseño o definición de estilo directamente en el archivo de diseño, no puede usar el método como setOrientation()en el código.

Átomo
fuente
2
Esto introduce una recursión infinita y la pila se desborda al intentar obtener una vista previa, haciendo que todo el Android Studio se cuelgue para siempre.
mato