121 votes

Sélecteur de la couleur de fond du TextView

Je tente de changer la couleur de fond d'un Android TextView lorsque l'utilisateur le touche. J'ai créé un sélecteur à cet effet, qui est stocké dans le fichier 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>

Le site clickable de l'attribut TextView est true au cas où cela vous intéresserait.

Lorsque j'affecte ce sélecteur à un TextView comme android:background="@color/selector" J'obtiens l'exception suivante au moment de l'exécution :

ERROR/AndroidRuntime(13130) : Causé par : org.xmlpull.v1.XmlPullParserException : Fichier XML binaire ligne n°6 : la balise nécessite un attribut 'drawable' ou une balise enfant définissant un drawable.

Lorsque 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 perturbe, c'est que je peux définir directement une référence de couleur, par exemple "@color/black", comme attribut d'arrière-plan. Cela fonctionne comme prévu. L'utilisation de sélecteurs ne fonctionne pas.

Je peux également utiliser le sélecteur comme textColor sans problème.

Quelle est la manière correcte d'appliquer un sélecteur de couleur d'arrière-plan à un fichier de type TextView dans Android ?

223voto

Benoit Martin Points 1719

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 de dessin. Ainsi, les modifications nécessaires ressembleraient à ceci :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/selected_state" />
</selector>

Il faudrait également déplacer cette ressource dans le répertoire drawable où elle aurait plus de sens puisqu'il ne s'agit pas d'un sélecteur de couleur à proprement parler.

Vous devrez alors créer le fichier res/drawable/selected_state.xml comme ceci :

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <solid android:color="@color/semitransparent_white" />
</shape>

et enfin, vous l'utiliserez comme ceci :

android:background="@drawable/selector"

Note La raison pour laquelle l'OP a obtenu une ressource image dessinée est probablement parce qu'il a essayé de faire référence à sa ressource qui était toujours dans le répertoire des couleurs mais en utilisant @drawable et 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 le PO a probablement, je l'espère, résolu son problème à présent.

119voto

azdev Points 5691

La solution de Benoit fonctionne, mais vous n'avez vraiment pas besoin d'encourir les frais généraux pour dessiner une forme. Puisque les couleurs peuvent être dessinables, il suffit de définir une couleur dans un fichier /res/values/colors.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="semitransparent_white">#77ffffff</drawable>
</resources>

Et utilisez-le ensuite comme tel dans votre sélecteur :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/semitransparent_white" />
</selector>

82voto

Jason Robinson Points 10878

Une solution encore plus simple à ce qui précède :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="@color/semitransparent_white" />
    </item>
    <item>
        <color android:color="@color/transparent" />
    </item>
</selector>

Sauvegardez-le dans le dossier drawable et vous êtes prêt à partir.

16voto

Maksim Dmitriev Points 515

Même ça, ça marche.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:drawable="@android:color/white" />
</selector>

J'ai ajouté le android:drawable à chaque élément, et leurs valeurs sont des couleurs.

Au fait, pourquoi dit-on que color est l'un des attributs de selector ? Ils n'écrivent pas ça. android:drawable est nécessaire.

Ressource de la liste des états de couleur

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

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