Auswahl auf Hintergrundfarbe von TextView

121

Ich versuche, die Hintergrundfarbe eines Android- TextViewWidgets zu ändern, wenn der Benutzer es berührt. Zu diesem Zweck habe ich einen Selektor erstellt, der in gespeichert ist res/color/selector.xmlund ungefähr so ​​aussieht:

<?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>

Das clickableAttribut von TextViewist true, falls das von Interesse ist.

Als ich diesen auf ein zuweisen TextViewwie android:background="@color/selector", ich erhalte die folgende Ausnahme zur Laufzeit:

ERROR / AndroidRuntime (13130): Auslöser: org.xmlpull.v1.XmlPullParserException: Binäre XML-Dateizeile Nr. 6: Tag erfordert ein 'drawable'-Attribut oder ein untergeordnetes Tag, das ein Drawable definiert

Wenn ich das Attribut in "Zeichenbar" ändere, funktioniert es, aber das Ergebnis sieht völlig falsch aus, da die IDs als Bildreferenzen anstelle von Farbreferenzen interpretiert werden (wie das "Zeichenbar" nahe legt).

Was mich verwirrt ist, dass ich eine Farbreferenz, z. B. "@ color / black", direkt als Hintergrundattribut festlegen kann. Dies funktioniert wie erwartet. Die Verwendung von Selektoren funktioniert nicht.

Ich kann den Selektor auch textColorohne Probleme als Selektor verwenden.

Was ist der richtige Weg, um einen Hintergrundfarbwähler auf einen TextViewin Android anzuwenden ?

Digitalbreed
quelle
Eine Farbe kann als zeichnbar interpretiert werden. Wie ist das Ergebnis genau falsch?
Romain Guy
Stattdessen wird nicht die Farbe angezeigt, sondern ein Bild aus meinen zeichnbaren Ressourcen als Hintergrund.
Digitalbreed
2
Das obige sollte funktionieren, wenn Sie android: drawable verwenden, nicht android: color - zumindest in diesem Fall funktioniert es für mich: android: drawable = "@ color / my_custom_color". Meine Farben sind in Werte / Farben.xml definiert
AgentKnopf

Antworten:

226

Das Problem hierbei ist, dass Sie die Hintergrundfarbe nicht mit einem Farbwähler definieren können, sondern einen zeichnbaren Selektor benötigen . Die notwendigen Änderungen würden also so aussehen:

<?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>

Sie müssten diese Ressource auch in das drawableVerzeichnis verschieben, in dem dies sinnvoller wäre, da es sich nicht um eine Farbauswahl an sich handelt.

Dann müssten Sie die res/drawable/selected_state.xmlDatei folgendermaßen erstellen :

<?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>

und schließlich würden Sie es so verwenden:

android:background="@drawable/selector"

Hinweis : Der Grund, warum das OP eine Bildressource gezeichnet hat, ist wahrscheinlich, dass er versucht hat, nur auf seine Ressource zu verweisen, die sich noch im Farbverzeichnis befindet, diese jedoch verwendet hat, @drawablesodass er eine ID-Kollision hatte und die falsche Ressource auswählte.

Ich hoffe, dies kann noch jemandem helfen, auch wenn das OP sein Problem wahrscheinlich inzwischen gelöst hat.

Benoit Martin
quelle
1
Danke, Benoit. Das Problem wurde gelöst (ich muss zugeben, ich kann mich nicht erinnern, wie genau ich es am Ende gemacht habe) und das Projekt wurde erfolgreich abgeschlossen. Ich weiß es zu schätzen, dass Sie hierher zurückgekommen sind, um Menschen zu helfen, die in Zukunft das gleiche Problem haben, großartiger Geist!
Digitalbreed
Ich kann das nicht zum Laufen bringen. Ich versuche, es auf eine Schaltfläche anzuwenden, und es setzt den Hintergrund auf die Standardfarbe des Selektors, ändert sich jedoch nicht in die in state_pressed definierte Form. Was könnte ich vermissen? Ich könnte eine neue Frage eröffnen, nur für den Fall, dass Sie mich in die richtige Richtung weisen könnten.
Maragues
@Maragues Es ist schwer zu sagen, ohne Code zu sehen. Ich würde empfehlen, dass Sie eine neue Frage öffnen und den entsprechenden Code veröffentlichen, damit wir herausfinden können, was falsch sein könnte. Sie können diesem Beitrag auch einen Kommentar mit einem Link zu Ihrem neuen Beitrag hinzufügen.
Benoit Martin
9
Warum nicht stattdessen einfach "drawable =" @ color / your_color "direkt in Ihren Auswahlelementen verwenden? Sie müssen keinerlei Formen oder andere Dateien definieren, sondern nur Ihre Farbdefinitionen in values ​​/ color.xml (es ist immer gut) nicht zu Hardcode Farben).
Javaxian
Funktioniert nicht. Es zeigt mir die andere Farbe als beide, die ich in Form von XML deklariert habe.
Er.Rohit Sharma
121

Die Lösung von Benoit funktioniert, aber Sie müssen wirklich keinen Aufwand verursachen, um eine Form zu zeichnen. Da Farben zeichnbar sein können, definieren Sie einfach eine Farbe in einer Datei /res/values/colors.xml:

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

Und dann als solches in Ihrem Selektor verwenden:

<?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/semitransparent_white" />
</selector>
Azdev
quelle
Aus irgendeinem Grund zeigt Ihre Lösung nicht die Farbe, sondern ein zufälliges Bild aus meinem Ordner mit zeichnbaren Ressourcen. Ich habe versucht, das Projekt zu bereinigen / Eigenschaften zu korrigieren / Eclipse erneut zu speichern / erneut zu öffnen, da es wirklich seltsam erscheint, aber ohne Erfolg. Seltsam.
Yahel
@Yahel Sie haben die Ressource zum Zeichnen von Farben möglicherweise genauso benannt wie eine tatsächlich zu zeichnende Datei?
Jona
@Jona: Nein, aber das Drawable wurde als background_application und das Color Drawable als background_white_transparent bezeichnet. Beide hatten Hintergrundinformationen ... Ich habe gesehen, dass in einem anderen Thread dasselbe mit anderen passiert ist, also habe ich dies als einen der zahlreichen Android-Fehler abgelegt und mein gesamtes Layout überarbeitet, um es zu umgehen.
Yahel
@ Yahel Mmm ... Nun, ich sehe dieses Problem, aber in meinem Fall nicht die gleichen Dateinamen ... Überprüfen Sie meine Fragen hier stackoverflow.com/questions/9004744/…
Jona
hat es nicht geschafft, dass es funktioniert, die Antwort von Benoit Martin hat gut funktioniert.
Emmanuel Touzery
83

Eine noch einfachere Lösung für das oben Gesagte:

<?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>

Speichern Sie das im Zeichenordner und los geht's.

Jason Robinson
quelle
1
Möglicherweise funktioniert dies, wird jedoch offiziell nicht unterstützt (Android Studio behandelt dies als Fehler).
Blackhex
@ Blackhex Seltsam. Funktioniert gut für mich in Eclipse. Es ist wahrscheinlich ein Lint-Fehler, und wenn dies der Fall ist, sollten Sie ihn deaktivieren oder ignorieren können.
Jason Robinson
6
Dies ist, was ich die Lösung betrachten würde.
Lay González
<item android:state_pressed="true" android:color="@color/vantablack"/>sieht semantisch identisch aus<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis
16

Auch das funktioniert.

<?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>

Ich android:drawablehabe jedem Element das Attribut hinzugefügt , und ihre Werte sind Farben.

Übrigens, warum sagen sie, dass dies coloreines der Attribute von ist selector? Sie schreiben nicht, dass android:drawableerforderlich ist.

Ressource für Farbstatusliste

<?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>
Maksim Dmitriev
quelle
Das Farbattribut funktioniert, wenn Sie Textansichtsfarben festlegen, jedoch nicht mit Hintergrund, da die Farben im Hintergrund tatsächlich als ColorDrawable
Akhil Dad
Beste und am einfachsten zu implementierende Lösung.
4gus71n
6

Für diejenigen, die dies tun möchten, ohne einen Hintergrundsektor zu erstellen, fügen Sie einfach diese Zeilen hinzu TextView

android:background="?android:attr/selectableItemBackground"
android:clickable="true"

Auch um es auswählbar zu machen, verwenden Sie:

android:textIsSelectable="true"
Dasser Basyouni
quelle