¿Cómo declarar varios atributos estilables con el mismo nombre para diferentes etiquetas?

Quiero que mi ViewA y ViewB tengan la etiqueta "title". 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 Atributo "title" ya ha sido 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 del 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?

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: Enlace . Cita pertinente:

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

Necesita usar 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 código 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); 

Haga esto en su lugar. No se necesita una 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) declararse de nuevo en otro estilo declare-styleable

  • Mostrar contenido en la barra de herramientas
  • Cómo crear una nueva línea o pestaña en <string> XML (eclipse / android)?
  • config.xml problema de formato
  • Mejor manera de analizar la Biblia en Android
  • Cambiar el fondo del botón alfa sin cambiar el valor del alfabeto del texto en Android?
  • Cambiar el color de la barra de notificación
  • Cómo especificar la carpeta lib para JARs cuando se utiliza un archivo de generación de hormigas generado por Android?
  • Agregar varias vistas personalizadas al diseño mediante programación
  • Error de Android RecyclerView
  • La aplicación de conversión de Android se bloquea en convertir
  • Convertir PSD a Android XML (formato) Formato?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.