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):
- No es necesario que los estilos comunes tengan el mismo nombre que una vista. (Gracias a esta respuesta por señalar eso).
- No necesita usar la herencia con un padre.
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.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes to all custom text based views -->
<declare-styleable name="TextAttributes">
<attr name="text" format="string"/>
<attr name="textSize" format="dimension"/>
<attr name="textColor" format="color"/>
<attr name="gravity">
<flag name="top" value="48" />
<flag name="center" value="17" />
<flag name="bottom" value="80" />
</attr>
</declare-styleable>
<!-- custom text views -->
<declare-styleable name="View1">
<attr name="text"/>
<attr name="textSize"/>
<attr name="textColor"/>
<attr name="gravity"/>
</declare-styleable>
<declare-styleable name="View2">
<attr name="text"/>
<attr name="textSize"/>
<attr name="textColor"/>
<attr name="gravity"/>
</declare-styleable>
</resources>
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 el format
). Entonces esto también funciona (y se ve más limpio):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View1">
<attr name="text" format="string"/>
<attr name="textSize" format="dimension"/>
<attr name="textColor" format="color"/>
<attr name="gravity">
<flag name="top" value="48" />
<flag name="center" value="17" />
<flag name="bottom" value="80" />
</attr>
</declare-styleable>
<declare-styleable name="View2">
<attr name="text"/>
<attr name="textSize"/>
<attr name="textColor"/>
<attr name="gravity"/>
</declare-styleable>
</resources>
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í ).
myattr1
se introducen una cadenaMyView1
y un enteroMyView2
?