Cómo crear un simple encargo View?
-
09-10-2019 - |
Pregunta
Me gustaría crear una View
personalizada en Android. He tratado de hacerlo lo más simple posible y ha creado una clase MyView
casi vacío y lo utilizó en mi LinearLayout
pero la aplicación falla en el arranque con "Fuerza de Cierre". ¿Cómo puedo hacer un simple View
personalizada? De acuerdo con Edificio componentes personalizados la View
obtiene el tamaño de 100x100 si yo no anulan onMeasure()
.
public class MyView extends View {
public MyView(Context context) {
super(context);
}
}
Y lo uso en un LinearLayout
con:
<view
class="com.example.MyView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0" />
¿Qué estoy haciendo mal?
Si utilizo el constructor que itemon sugerir y la llamada correspondiente a la superclase. A continuación, la "Fuerza de Cierre" se ha ido, pero mi LinearLayout
se rompe, no se muestran los componentes después de MyView
.
Aquí está mi main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0"
android:background="#f00"
android:text="Hello"
/>
<view
class="com.example.MyView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0"
android:background="#00f"
android:text="World"
/>
</LinearLayout>
Solución
Puede ser que usted podría definir otro método constructor de esta manera:
public MyView(Context context, AttributeSet attrs)
el marco androide tratará de construir la interfaz de usuario con su visión desde el constructor anterior.
Otros consejos
La Guía del desarrollador de Android tiene una sección llamada Edificio componentes personalizados. Por desgracia, la discusión de los atributos XML sólo cubre declarando el control dentro del archivo de diseño y no realmente el manejo de los valores dentro de la inicialización de clase. Los pasos son como sigue:
atributos Declare en valores \ attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomView">
<attr name="android:text"/>
<attr name="android:textColor"/>
<attr name="extraInformation" format="string" />
</declare-styleable>
</resources>
Aviso el uso de un nombre no calificado en la etiqueta de declaración-styleable. androide atributos no estándar como extraInformation necesitan tener su tipo declarado. Etiquetas declarados en la superclase estarán disponibles en las subclases sin tener que volver a declarar.
Crea constructores
Puesto que hay dos constructores que utilizan un AttributeSet para la inicialización, es conveniente crear un método de inicialización separada para los constructores a llamada.
private void init(AttributeSet attrs){
TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView);
//Use a
Log.i("test",a.getString(R.styleable.MyCustomView_android_text));
Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK));
Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation));
//Don't forget this
a.recycle();
}
R.styleable.MyCustomView es un int autogenerado [] recurso donde cada elemento es el ID de un atributo. Los atributos se generan para cada propiedad en el XML añadiendo el nombre del atributo para el nombre del elemento. Los atributos pueden ser recuperados de la TypedArray utilizando diversas funciones GET. Si el atributo no está definido en el XML, se devuelve nulo. Excepto, por supuesto, si el tipo de retorno es un primitivo, en cuyo caso se devuelve el segundo argumento.
Si no desea recuperar todos los atributos, es posible crear esta matriz manually.The Identificación de atributos estándar de Android están incluidos en android.R.attr, mientras que los atributos de este proyecto están en R.attr .
int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};
Tenga en cuenta que usted no debe usar nada en android.R.styleable, según este hilo se puede cambiar en el futuro. Es todavía en la documentación como para ver todas estas constantes en el único lugar es útil.
El uso en un diseño de archivos tales como el diseño \ main.xml Incluir la declaración de espacio de nombres
xmlns: app = "http://schemas.android.com/apk/res/com.mycompany.projectname"
en el elemento de nivel superior xml.
<com.mycompany.projectname.MyCustomView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:text="Test text"
android:textColor="#FFFFFF"
app:extraInformation="My extra information";
/>
Referencia la vista personalizada utilizando el nombre completo.
Android LabelView muestra
Si desea ver un ejemplo completo, mirada al androide muestra la etiqueta de vista.
LabelView.java
TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
attrs.xml
<declare-styleable name="LabelView">
<attr name="text"format="string"/>
<attr name="textColor"format="color"/>
<attr name="textSize"format="dimension"/>
</declare-styleable>
custom_view_1.xml
<com.example.android.apis.view.LabelView
android:background="@drawable/blue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:text="Blue"app:textSize="20dp"/>
Esto está contenida en un LinearLayout con un atributo de espacio de nombres:
xmlns: app = "http://schemas.android.com/apk/res/com.example.android.apis"