tag para lib etiquetas emplea ejemplo atributo java android xml declare-styleable styleable

java - lib - ¿Cómo declarar varios atributos stylable con el mismo nombre para diferentes etiquetas?



taglib java (4)

El enlace que has publicado te da la respuesta correcta. Esto es lo que sugiere que hagas:

<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="title" format="string" /> <declare-styleable name="ViewA"> <attr name="title" /> </declare-styleable> <declare-styleable name="ViewB"> <attr name="title" /> <attr name="max" format="integer" /> </declare-styleable> </resources>

Ahora, R.styleable.ViewA_title y R.styleable.ViewB_title son accesibles.

Si tienes la oportunidad, lee esta respuesta: Link . Cita relevante:

Puede definir atributos en el elemento superior o dentro de un elemento. Si voy a usar un atributo en más de un lugar, lo pongo en el elemento raíz.

Quiero que tanto mi ViewA como mi ViewB tengan la etiqueta "título". Pero no puedo poner esto en attrs.xml :

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ViewA"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ViewB"> <attr name="title" format="string" /> <attr name="max" format="integer" /> </declare-styleable> </resources>

debido al error, el atributo "título" ya se ha definido . Otra pregunta muestra esta solución:

<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="title" format="string" /> <declare-styleable name="ViewB"> <attr name="max" format="integer" /> </declare-styleable> </resources>

pero en ese caso, R.styleable.ViewA_title y R.styleable.ViewB_title no se generan. Los necesito para leer los atributos de AttributeSet usando el siguiente código:

TypedArray a=getContext().obtainStyledAttributes( as, R.styleable.ViewA); String title = a.getString(R.styleable.ViewA_title);

¿Como puedo resolver esto?


Haga esto en su lugar. No se necesita etiqueta parent

<resources> <declare-styleable name="ViewA"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ViewB" > <attr name="title" /> <attr name="min" format="integer" /> <attr name="max" format="integer" /> </declare-styleable> </resources>

Esto se debe a que una vez que se declara el title en ViewA , no es necesario (y tampoco puede) ser declarado nuevamente en otro estilo de declare-styleable


Necesitas usar la herencia.

<resources> <declare-styleable name="ViewA"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ViewB" parent="ViewA"> // inherit from ViewA <attr name="min" format="integer" /> <attr name="max" format="integer" /> </declare-styleable> </resources>

En tu codigo java

String namespace = "http://schemas.android.com/apk/res/" + getContext().getPackageName(); int title_resource = attrs.getAttributeResourceValue(namespace, "title", 0); String title = ""; if(title_resource!=0){ title = getContext().getString(title_resource); } int min = attrs.getAttributeResourceValue(namespace, "min", 0); // read int value int max = attrs.getAttributeResourceValue(namespace, "max", 0);


<resources> <declare-styleable name="ViewA"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ViewB" parent="ViewA"> // inherit from ViewA <attr name="min" format="integer" /> <attr name="max" format="integer" /> </declare-styleable>

Esto no funciona。

<resources> <attr name="title" format="string" /> <declare-styleable name="ViewA"> <attr name="title" /> </declare-styleable> <declare-styleable name="ViewB"> <attr name="title" /> <attr name="max" format="integer" /> </declare-styleable>

Esto tampoco funciona。

<resources> <declare-styleable name="ViewA"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ViewB" > <attr name="title" /> <attr name="min" format="integer" /> <attr name="max" format="integer" /> </declare-styleable>

¡Esto estaba bien!