Comme Priya Singhal a répondu, Android Studio nécessite que les noms d'attributs communs soient définis dans leur propre nom de style. Ils ne peuvent plus être à la racine.
Cependant, il y a quelques autres choses à noter (c'est pourquoi j'ajoute également une réponse):
- Les styles courants n'ont pas besoin d'être nommés de la même manière qu'une vue. (Merci à cette réponse pour l'avoir signalé.)
- Vous n'avez pas besoin d'utiliser l'héritage avec un parent.
Exemple
Voici ce que j'ai fait dans un projet récent qui a deux vues personnalisées qui partagent les mêmes attributs. Tant que les vues personnalisées ont toujours les noms des attributs et n'incluent pas de format
, je peux toujours y accéder normalement à partir du code.
<?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>
Exemple simplifié
En fait, je n'ai même pas besoin de mettre les attributs sous un nom personnalisé. Tant que je les définit (donnez-leur un format
) pour au moins une vue personnalisée, je peux les utiliser n'importe où (sans le format
). Donc, cela fonctionne également (et semble plus propre):
<?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>
Pour un grand projet, cependant, cela pourrait devenir compliqué et les définir en haut à un seul endroit pourrait être mieux (comme recommandé ici ).
myattr1
chaîne est-elle entréeMyView1
et l'entier comprisMyView2
?