J'écris quelques vues personnalisées qui partagent des attributs du même nom. Dans leur <declare-styleable>
section respective de attrs.xml
j'aimerais utiliser les mêmes noms pour les attributs:
<?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>
J'obtiens une erreur disant cela myattr1
et myattr2
sont déjà définis. J'ai trouvé que je devais omettre l' format
attribut for myattr1
and myattr2
in MyView2
, mais si je fais cela, j'obtiens l'erreur suivante dans la console:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
Y a-t-il un moyen d'accomplir cela, peut-être une sorte d'espacement de noms (juste deviner)?
myattr1
chaîne est-elle entréeMyView1
et l'entier comprisMyView2
?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr
Pour toute la vue que j'essaie de déclarer. Des idées?<attr name="myattr1" format="string|integer" />
. Travaille pour moi.Je publie cette réponse car la solution publiée ci-dessus n'a pas fonctionné pour moi dans Android Studio. J'ai besoin de partager mes attributs personnalisés parmi mes vues personnalisées, j'ai donc essayé la solution ci-dessus dans Android Studio mais je n'ai pas eu de chance. Alors j'expérimente et je cherche un moyen de le faire. J'espère que cela pourrait aider quelqu'un à la recherche du même problème.
Cela fonctionne complètement pour moi. Nous devons rendre un parent stylable, puis hériter de ce parent stylable. Par exemple, comme je l'ai fait ci-dessus: Nom de style parent MyView et hérité de cela à mon autre stylable comme MyView1 et MyView2 respectivement.
la source
MyView2
droite:R.styleable.MyView2_myattr1
, mal:R.styleable.MyView_myattr1
)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):
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.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 leformat
). Donc, cela fonctionne également (et semble plus propre):Pour un grand projet, cependant, cela pourrait devenir compliqué et les définir en haut à un seul endroit pourrait être mieux (comme recommandé ici ).
la source
parent
attribut, mais je n'ai pas vu beaucoup de messages suggérant son utilisation.parent
. Je pense que je disais simplement que ce n'était pas nécessaire.Merci Lewis, j'ai eu le même problème, et votre solution d'héritage m'a donné un indice pour le faire comme ci-dessous et cela fonctionne bien.Je viens de déclarer les attributs communs ci-dessus et de les réécrire dans le corps de la déclaration de style sans formatage. J'espère que ça aide quelqu'un
la source
Juste au cas où quelqu'un serait toujours coincé avec ce problème après avoir essayé la solution disponible. Je suis resté avec ajouter un
subtitle
attribut avec lestring
format.Ma solution est de supprimer le format.
avant:
<attr name="subtitle" format="string"/>
après:
<attr name="subtitle"/>
la source