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.