Estoy escribiendo algunas vistas personalizadas que comparten algunos atributos con el mismo nombre. En su <declare-styleable>sección respectiva , attrs.xmlme gustaría usar los mismos nombres para los atributos:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Recibo un error que dice eso myattr1y myattr2ya estoy definido. Descubrí que debería omitir el formatatributo for myattr1and myattr2in MyView2, pero si lo hago, obtengo el siguiente error en la consola:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
¿Hay alguna manera de lograr esto, tal vez algún tipo de espacio de nombres (solo adivinando)?

myattr1se introducen una cadenaMyView1y un enteroMyView2?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttrPor toda la vista que intento declarar. ¿Algunas ideas?<attr name="myattr1" format="string|integer" />. Funciona para mi.Estoy publicando esta respuesta ya que la solución publicada anteriormente no funcionó para mí en Android Studio. Necesito compartir mis atributos personalizados entre mis vistas personalizadas, así que probé la solución anterior en Android Studio pero no tuve suerte. Entonces experimento y hago un camino para hacerlo. Espero que pueda ayudar a alguien que busca el mismo problema.
Esto funciona para mí por completo. Necesitamos hacer que un padre tenga estilo y luego debemos heredar ese padre con estilo. Por ejemplo, como he hecho anteriormente: Nombre con estilo de los padres MyView y heredé esto a mi otro estilo como MyView1 y MyView2 respectivamente.
fuente
MyView2correcta:R.styleable.MyView2_myattr1incorrectaR.styleable.MyView_myattr1)Como respondió Priya Singhal, Android Studio requiere que los nombres de atributos comunes se definan dentro de su propio nombre de estilo. Ya no pueden estar en la raíz.
Sin embargo, hay un par de otras cosas a tener en cuenta (por eso también estoy agregando una respuesta):
Ejemplo
Esto es lo que hice en un proyecto reciente que tiene dos vistas personalizadas que comparten los mismos atributos. Siempre que las vistas personalizadas sigan teniendo los nombres de los atributos y no incluyan un
format, todavía puedo acceder a ellos de forma normal desde el código.Ejemplo simplificado
De hecho, ni siquiera necesito poner los atributos bajo un nombre personalizado. Siempre que los defina (déles un
format) para al menos una vista personalizada, puedo usarlos en cualquier lugar (sin elformat). Entonces esto también funciona (y se ve más limpio):Sin embargo, para un proyecto grande, esto podría ser complicado y definirlos en la parte superior en una sola ubicación podría ser mejor (como se recomienda aquí ).
fuente
parentatributo, pero no he visto muchas publicaciones que sugieran su uso.parent. Creo que solo decía que no era necesario.Gracias Lewis, tuve el mismo problema, y su solución de herencia me dio la pista para hacerlo como se muestra a continuación y funciona bien. Acabo de declarar atributos comunes en lo anterior y volver a escribirlo en el cuerpo de la declaración de estilo sin formato. Espero que esto ayude a alguien
fuente
En caso de que alguien aún se quede con este problema después de probar la solución disponible. Me quedé con agregar
subtitleatributo constringformato.Mi solución es eliminar el formato.
antes de:
<attr name="subtitle" format="string"/>después:
<attr name="subtitle"/>fuente