Android ListView Selector Farbe

73

Hallo zusammen,

Ich habe 2 Fragen zu einer ListView in Android:

  1. Wie kann ich bekommen die Farbe der fokussierten Zeile des Listview? Ich habe versucht, die ListView.getSelector () -Methode zu verwenden, die mir laut Dokumentation das geben soll, wonach ich suche, aber es gibt mir ein Drawable-Objekt, von dem ich nicht weiß, wie ich die Farbe abrufen kann (wenn möglich). ..).

  2. Wie kann ich einstellen , die Farbe der Listenansicht der fokussierten Reihe? Hier habe ich versucht, die setSelector () -Methode für die Listenansicht zu verwenden und ihr ein ColorDrawable-Objekt zu übergeben. Das Ergebnis ist jedoch, dass der gesamte Hintergrund der Listenansicht in dieser Farbe gezeichnet ist ... und dies ist nicht das, was ich wollte natürlich...

Vielen Dank!

WhiteTigerK
quelle
Dies kann helfen (es gibt sowohl Fragen als auch Lösungen): stackoverflow.com/questions/2065430/…
Uroš Milivojević
Es scheint, dass es in Android 2 einen Fehler gibt, der dazu führt, dass die Farbe den gesamten Hintergrund beeinflusst. Überprüfen Sie meine Antwort, die auf eine Problemumgehung für eine andere Frage verweist.
Richard Le Mesurier

Antworten:

89

Der Listenwähler, der gezeichnet werden kann, ist ein StateListDrawable- er enthält Verweise auf mehrere Ziehbare für jeden Status, in dem die Liste ausgewählt, fokussiert, gedrückt, deaktiviert werden kann ...

Während Sie das Zeichenobjekt mit abrufen können getSelector(), glaube ich nicht, dass Sie ein bestimmtes Drawablevon einem abrufen können StateListDrawable, und es scheint auch nicht möglich zu sein, die Farbe programmgesteuert direkt von einem abzurufen ColorDrawable.

Zum Einstellen der Farbe benötigen Sie eine StateListDrawablewie oben beschrieben. Sie können dies in Ihrer Liste mithilfe des android:listSelectorAttributs festlegen und das Zeichen in XML wie folgt definieren:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_enabled="false" android:state_focused="true"
        android:drawable="@drawable/item_disabled" />
  <item android:state_pressed="true"
        android:drawable="@drawable/item_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/item_focused" />
</selector>
Christopher Orr
quelle
12
Ich würde auch die Zuweisung der Listenauswahl zu einem benutzerdefinierten Thema verschieben, damit alle Listen in Ihrer Anwendung gleich aussehen. <Item name = "android: listSelector"> @ drawable / my_list_highlight </ item>
Alex Volovoy
5
Dies funktioniert zumindest nicht mit API 7/8. Es scheint, als würde der gesamte Hintergrund beim Drücken auf die gleiche gepresste Farbe geändert, einschließlich des Hintergrunds anderer Zeilen sowie der Randlinien (ich habe Schwarz) zwischen den Zeilen.
Jonny
@Jonny es funktioniert bei mir bei der Verwendung von Zeichen, aber nicht bei der Verwendung von Farben. Habe eine Antwort hinzugefügt, die auf eine gute Problemumgehung verweist, die für Farben funktioniert.
Richard Le Mesurier
Hallo, ich versuche, einen Selektor in meiner Listenansicht zu verwenden, wie Sie vorgeschlagen haben, aber er hat 9 PNGs und keine Farben. Außerdem habe ich ein benutzerdefiniertes Layout, das ich in meiner Listenansicht aufblase und den Selektor als Hintergrund für dieses benutzerdefinierte Layout verwende. Können Sie vorschlagen ?
Prateek
11

HINZUFÜGEN: Die Antwort von @ Christopher funktioniert nicht mit API 7/8 (gemäß @ Jonnys korrektem Kommentar), WENN Sie Farben anstelle von Zeichen verwenden. (In meinen Tests funktioniert die Verwendung von Drawables gemäß Christopher einwandfrei.)

Hier ist das FIX für 2.3 und darunter bei Verwendung von Farben:

Laut @Charles Harley gibt es in 2.3 und darunter einen Fehler, bei dem das Füllen des Listenelements mit einer Farbe dazu führt, dass die Farbe über die gesamte Liste fließt. Seine Lösung besteht darin, ein shapeZeichenelement zu definieren, das die gewünschte Farbe enthält, und dieses anstelle der Farbe zu verwenden.

Ich schlage vor, auf diesen Link zu schauen, wenn Sie nur eine Farbe als Auswahl verwenden möchten und auf Android 2 abzielen (oder zumindest Android 2 zulassen).

Richard Le Mesurier
quelle
2
Das hat mich gerade wieder gebissen, danke, dass du mich daran erinnert hast, was das eigentliche Problem ist.
Reuben Scratton