188 votes

Attributs personnalisés dans styles.xml

J'ai créé un widget personnalisé, et je suis déclarant en layout.xml. J'ai également ajouté quelques attributs personnalisés dans attr.xml. Toutefois, lorsque vous essayez de déclarer ces attributs dans un style en styles.xml il me No resource found that matches the given name: attr 'custom:attribute'.

J'ai mis l' xmlns:custom="http://schemas.android.com/apk/res/com.my.package" dans l'ensemble des tags dans styles.xml, y compris <?xml>, <resources>, et <style>, mais il me donne toujours la même erreur, qu'il ne peut pas trouver ma coutume d'espace de noms XML.

Par contre, je peux utiliser mon espace de noms à attribuer manuellement les attributs de la vue dans mon layout.xml, donc il n'y a rien de mal avec l'espace de noms. Mon problème réside dans la prise de styles.xml conscient de ma attr.xml.

Merci à l'avance.

369voto

styler1972 Points 3651

J’ai pensé à elle ! La réponse doit pas spécifier l’espace de noms dans le style.

44voto

VinceStyling Points 896

la réponse ci-dessus est travaillé pour moi, j'ai essayé un petit changement, je déclare styleable pour une classe dans les ressources de l'élément.

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

en déclarer-styleable, le nom de l'attribut fait référence à un nom de classe, j'ai donc eu une classe d'affichage de l'appel "com.mon.package.nom.VerticalView", il représentait ce déclarer doit être utilisé en VerticalView ou des sous-classes de VerticalView. nous pouvons donc déclarer un style comme ceci :

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

c'est pourquoi nous n'avons pas déclarer l'espace de noms à des ressources élément, il encore du travail.

10voto

Abid H. Mujtaba Points 436

Styler et vince modification a fonctionné pour moi. Je tenais à préciser que @vince explication est peut-être pas tout à fait exacte.

Pour tester l'hypothèse que le nom de l'attribut de l' declare-styleable correspondant au nom de la classe de vue personnalisée est ce qui nous permet d'accéder à l'attribut personnalisé sans un espace de noms, j'ai changé le nom de l' declare-styleable (la vue personnalisée a été nommé d' TestViewFont:

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

J'ai ensuite changé l' obtainStyledAttributes appel dans l'affichage personnalisé pour refléter ceci:

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

Le code courait toujours. Donc, je ne pense pas que c'est une sorte d'introspection par l' declare-styleable de la classe à laquelle il est nommé d'après.

Donc je suis amené à croire que tout attribut personnalisé peut être utilisé pour déclarer un style sans se référer à un espace de noms.

Peu importe, merci à tous pour l'aide les gars, il a résolu mon problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X