J'ai créé un widget personnalisé et je le déclare dans layout.xml. J'ai également ajouté des attributs personnalisés dans attr.xml. Cependant, lorsque vous essayez de déclarer ces attributs dans un style dans styles.xml, cela me donneNo resource found that matches the given name: attr 'custom:attribute'.
J'ai mis le xmlns:custom="http://schemas.android.com/apk/res/com.my.package"
dans toutes les balises dans styles.xml, y compris <?xml>
, <resources>
et <style>
, mais cela me donne toujours la même erreur, qu'il ne peut pas trouver mon espace de noms XML personnalisé.
Cependant, je peux utiliser mon espace de noms pour attribuer manuellement des attributs à la vue dans mon layout.xml, donc il n'y a rien de mal avec l'espace de noms. Mon problème est de rendre styles.xml conscient de mon attr.xml.
la source
cutsom:xmlns=...
?? ne devrait pas êtrexmlns:cutsom=...
?Réponses:
Je l'ai compris! La réponse est de NE PAS spécifier l'espace de noms dans le style.
la source
declare-stylable
au lieu d'une énumération. Je ne sais pas pourquoi les énumérations ne fonctionnaient pas, mais cette solution de contournement était assez bonne pour moi.la réponse ci-dessus fonctionne pour moi, j'ai essayé un petit changement, je déclare stylable pour une classe dans l'élément de ressources.
dans declare-styleable , l' attribut name faisait référence à un nom de classe, donc j'ai eu un appel de classe de vue "com.my.package.name.VerticalView", il représentait que cette déclaration devait être utilisée dans VerticalView ou des sous-classes de VerticalView. afin que nous puissions déclarer le style comme ceci:
c'est pourquoi nous n'avons pas déclaré d'espace de noms à l'élément resources, cela fonctionne toujours.
la source
values / styles.xml
valeurs / attrs.xml
values / colors.xml
values / dimens.xml
En utilisant
DEMO
la source
La modification de Styler et Vince a fonctionné pour moi. Je voulais souligner que l'explication de @ vince n'est peut-être pas tout à fait exacte.
Pour tester l'hypothèse que l'attribut name de la
declare-styleable
correspondance avec le nom de la classe de vue personnalisée nous permet d'accéder à l'attribut personnalisé sans espace de noms, j'ai changé le nom de ladeclare-styleable
(la vue personnalisée a été nomméeTestViewFont
:J'ai ensuite changé l'
obtainStyledAttributes
appel dans la vue personnalisée pour refléter ceci:Le code fonctionnait toujours. Je ne pense donc pas que ce soit une sorte d'introspection de la part
declare-styleable
de la classe dont il porte le nom.Ainsi, je suis amené à croire que tous les attributs personnalisés peuvent être utilisés pour déclarer un style sans faire référence à un espace de noms.
Quoi qu'il en soit, merci pour tous les types d'aide, cela a résolu mon problème.
la source
declare-styleable
bloc ou non. (désolé, je ne trouve pas la page de référence pour cela…) Sauf pour les attributs de l'android
espace de noms, vous ne devez indiquer que le nom de l'attribut.Définissez quelques attributs
Utilisez-le dans un fichier de mise en page comme
Enfin, utilisez-le dans un fichier de style
La différence entre le fichier de style et le fichier de mise en page est que nous n'ajoutons pas de prefiexapp:
Essayez-le, passez une bonne journée, cela fonctionne pour moi.
la source
Au cas où cela aiderait quelqu'un d'autre, mon erreur était que ma classe de vue personnalisée appelait AttributeSet.getAttributeValue, par exemple
... ce qui empêchait la lecture de mon attribut personnalisé pour ma vue personnalisée.
Le correctif était à utiliser
obtainStyledAttributes
dans ma vue personnalisée:Un indice que cela fonctionne correctement est que vous pouvez Ctrl / Apple + cliquer sur
R.styleable.MyTextViewStyleable_customFont
pour accéder directement à votre définition attrs.xml.Il m'a fallu un certain temps pour repérer cette différence critique entre mon code et les autres exemples, car l'attribut personnalisé fonctionnait bien lorsqu'il était transmis directement via le XML de mise en page (au lieu de via un style).
la source