J'essaie de changer la couleur d'arrière-plan d'un TextView
widget Android lorsque l'utilisateur le touche. J'ai créé un sélecteur à cet effet, qui est stocké dans res/color/selector.xml
et ressemble à peu près à ça:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:color="@color/semitransparent_white"
/>
<item
android:color="@color/transparent"
/>
</selector>
L' clickable
attribut de TextView
est true
, au cas où cela vous intéresse.
Lorsque j'attribue ce sélecteur à un TextView
as android:background="@color/selector"
, j'obtiens l'exception suivante au moment de l'exécution:
ERREUR / AndroidRuntime (13130): causée par: org.xmlpull.v1.XmlPullParserException: ligne de fichier XML binaire # 6: la balise nécessite un attribut 'drawable' ou une balise enfant définissant un dessinable
Quand je change l'attribut en drawable, cela fonctionne, mais le résultat est complètement faux car les ID semblent être interprétés comme des références d'image au lieu de références de couleur (comme le suggère le "drawable").
Ce qui me trouble, c'est que je peux définir une référence de couleur, par exemple "@ color / black", comme attribut d'arrière-plan directement. Cela fonctionne comme prévu. L'utilisation de sélecteurs ne fonctionne pas.
Je peux aussi utiliser le sélecteur comme le textColor
sans problèmes.
Quelle est la bonne façon d'appliquer un sélecteur de couleur d'arrière-plan à un TextView
sous Android?
Réponses:
Le problème ici est que vous ne pouvez pas définir la couleur d'arrière-plan à l'aide d'un sélecteur de couleur, vous avez besoin d'un sélecteur pouvant être dessiné . Ainsi, les changements nécessaires ressembleraient à ceci:
Vous devrez également déplacer cette ressource vers le
drawable
répertoire où cela aurait plus de sens car ce n'est pas un sélecteur de couleur en soi.Ensuite, vous devrez créer le
res/drawable/selected_state.xml
fichier comme ceci:et enfin, vous l'utiliseriez comme ceci:
Remarque : la raison pour laquelle l'OP obtenait une ressource image dessinée est probablement parce qu'il a essayé de simplement référencer sa ressource qui était toujours dans le répertoire des couleurs, mais en utilisant
@drawable
ainsi il s'est retrouvé avec une collision d'ID, sélectionnant la mauvaise ressource.J'espère que cela peut encore aider quelqu'un même si l'OP a probablement, j'espère, résolu son problème maintenant.
la source
La solution de Benoit fonctionne, mais vous n'avez vraiment pas besoin d'engager des frais généraux pour dessiner une forme. Puisque les couleurs peuvent être dessinables, définissez simplement une couleur dans un fichier /res/values/colors.xml:
Et puis utilisez comme tel dans votre sélecteur:
la source
Une solution encore plus simple à ce qui précède:
Enregistrez-le dans le dossier pouvant être dessiné et vous êtes prêt à partir.
la source
<item android:state_pressed="true" android:color="@color/vantablack"/>
ressemble sémantiquement identique à<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
Même cela fonctionne.
J'ai ajouté l'
android:drawable
attribut à chaque élément et leurs valeurs sont des couleurs.Au fait, pourquoi disent-ils que
color
c'est l'un des attributs deselector
? Ils n'écrivent pas ce quiandroid:drawable
est obligatoire.Ressource de liste d'état des couleurs
la source
Pour qui cherche à le faire sans créer de secteur d'arrière-plan, ajoutez simplement ces lignes à la
TextView
Aussi pour le rendre sélectionnable, utilisez:
la source