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>
¿Fue útil?

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"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top