studio para intellij idea entorno desarrollo configurar android android-layout android-studio intellij-idea android-tools-namespace

para - ide android



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

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 LinearLayout como raíz de somelayout.xml , tendremos un nivel de vista adicional, entonces 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 de la fusión IDE siempre actúa como FrameLayout, y veremos algo así:

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

Vista previa acelerar el desarrollo de diseños mucho, es triste perder una gran ayuda, incluso para algunos diseños. ¿Puede haber una manera de especificar cómo debe interpretar Vista previa la etiqueta de merge en un diseño particular?


Editar: respuesta obsoleta. Ver respuesta por starkej2.

Android Studio 0.5.8 agregó soporte para herramientas: showIn. Al usarlo, es posible obtener una vista previa de <merge> layouts.

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>


Hay un nuevo atributo parentTag tools ( agregado en Android Studio 2.2 ) que puede usar para especificar el tipo de diseño para una etiqueta merge, que hará que el diseño se represente 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 : Deben especificarse android:layout_width y android:layout_height para que el diseño se muestre correctamente en el editor.


También es posible usar clases personalizadas como padre en lugar de combinar como

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

Y luego infle directamente este diseño y la vista de resultados de SomeView a SomeView . El estudio de Android verificará directamente la clase principal de SomeView y manejará la vista previa como LinerLayout . Puede usar el método onFinishInflate() en SomeView para enlazar vistas mediante 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 un método como setOrientation() en el código.