Como Priya Singhal respondeu, o Android Studio exige que os nomes de atributos comuns sejam definidos em seu próprio nome de estilo. Eles não podem mais estar na raiz.
No entanto, há algumas outras coisas a serem observadas (e é por isso que também estou adicionando uma resposta):
- Os estilos comuns não precisam ter o mesmo nome que uma exibição. (Obrigado a esta resposta por apontar isso.)
- Você não precisa usar herança com um pai.
Exemplo
Aqui está o que eu fiz em um projeto recente que possui duas visualizações personalizadas que compartilham os mesmos atributos. Enquanto as visualizações personalizadas ainda tiverem os nomes dos atributos e não incluírem a format
, ainda posso acessá-las normalmente a partir do 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>
Exemplo simplificado
Na verdade, nem preciso colocar os atributos em um nome personalizado. Desde que eu os defina (dê a format
) a pelo menos uma visualização personalizada, posso usá-los em qualquer lugar (sem a format
). Portanto, isso também funciona (e parece mais limpo):
<?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>
Para um projeto grande, porém, isso pode ficar confuso e defini-los na parte superior em um único local pode ser melhor (como recomendado aqui ).
myattr1
está a stringMyView1
e o número inteiroMyView2
?