Ist es möglich, über die Listenauswahl jedem Listenansichtselement einen benutzerdefinierten Hintergrund zuzuweisen?
Die Standardauswahl gibt @Android:color/transparent
Für den Fall state_focused="false"
An, aber das Ändern dieser Option in eine benutzerdefinierte Zeichenfunktion wirkt sich nicht auf Elemente aus, die nicht ausgewählt sind. Romain Guy scheint in dieser Antwort vorzuschlagen, dass dies möglich ist.
Zurzeit wird derselbe Effekt erzielt, indem für jede Ansicht ein benutzerdefinierter Hintergrund verwendet und ausgeblendet wird, wenn das Element ausgewählt/fokussiert/was auch immer angezeigt wird. Es wäre jedoch eleganter, wenn dies alles an einem Ort definiert wäre.
Als Referenz ist dies der Selektor, mit dem ich versuche, dies zum Laufen zu bringen:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="false"
Android:drawable="@drawable/list_item_gradient" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item Android:state_focused="true" Android:state_enabled="false"
Android:state_pressed="true"
Android:drawable="@drawable/list_selector_background_disabled" />
<item Android:state_focused="true" Android:state_enabled="false"
Android:drawable="@drawable/list_selector_background_disabled" />
<item Android:state_focused="true" Android:state_pressed="true"
Android:drawable="@drawable/list_selector_background_transition" />
<item Android:state_focused="false" Android:state_pressed="true"
Android:drawable="@drawable/list_selector_background_transition" />
<item Android:state_focused="true"
Android:drawable="@drawable/list_selector_background_focus" />
</selector>
Und so stelle ich den Selektor ein:
<ListView
Android:id="@Android:id/list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:listSelector="@drawable/list_selector_background" />
Vielen Dank im Voraus für jede Hilfe!
Ich war selbst frustriert und habe es endlich gelöst. Wie Romain Guy andeutete, gibt es einen anderen Staat, "Android:state_selected"
, das du benutzen musst. Verwenden Sie einen Status, der für den Hintergrund Ihres Listenelements gezeichnet werden kann, und verwenden Sie einen anderen Status, der für listSelector
Ihrer Liste gezeichnet werden kann:
list_row_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="?android:attr/listPreferredItemHeight"
Android:background="@drawable/listitem_background"
>
...
</LinearLayout>
listitem_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="true" Android:drawable="@color/Android:transparent" />
<item Android:drawable="@drawable/listitem_normal" />
</selector>
layout.xml mit der ListView:
...
<ListView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:listSelector="@drawable/listitem_selector"
/>
...
listitem_selector.xml:
<?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/listitem_pressed" />
<item Android:state_focused="true" Android:drawable="@drawable/listitem_selected" />
</selector>
Die Lösung von dglmtn funktioniert nicht, wenn Sie ein 9-Patch haben, das mit Auffüllung als Hintergrund gezeichnet werden kann. Seltsame Dinge passieren, ich möchte nicht einmal darüber sprechen, wenn Sie ein solches Problem haben, kennen Sie sie.
Wenn Sie nun eine Listenansicht mit verschiedenen Status und 9-Patch-Drawables haben möchten (es würde mit allen Drawables und Farben funktionieren, denke ich), müssen Sie zwei Dinge tun:
Was Sie tun sollten, ist zuerst die row_selector.xml zu setzen:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:state_enabled="true"
Android:state_pressed="true" Android:drawable="@drawable/list_item_bg_pressed" />
<item Android:state_enabled="true"
Android:state_focused="true" Android:drawable="@drawable/list_item_bg_focused" />
<item Android:state_enabled="true"
Android:state_selected="true" Android:drawable="@drawable/list_item_bg_focused" />
<item
Android:drawable="@drawable/list_item_bg_normal" />
</selector>
Vergessen Sie nicht den Android:state_selected
. Es funktioniert wie Android:state_focused
Für die Liste, aber es wird auf das Listenelement angewendet.
Wenden Sie jetzt den Selektor auf die Elemente (row.xml) an:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:background="@drawable/row_selector"
>
...
</RelativeLayout>
Machen Sie eine transparente Auswahl für die Liste:
<ListView
Android:id="@+id/Android:list"
...
Android:listSelector="@Android:color/transparent"
/>
Das sollte das Ding machen.
Verwenden Sie niemals eine "Hintergrundfarbe" für Ihre Listenansichtszeilen ...
dies wird jede Selektoraktion blockieren (war mein Problem!)
viel Glück!
Der Artikel "Warum ist meine Liste schwarz? Eine Android Optimierung" im Android Entwickler-Blog hat eine ausführliche Erklärung, warum die Listenhintergrund wird beim Scrollen schwarz Einfache Antwort: Setzen Sie cacheColorHint in Ihrer Liste auf transparent (# 00000000).
Es reicht, wenn Sie list_row_layout.xml
Eingeben:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center_vertical"
Android:background="@drawable/listitem_background">... </LinearLayout>
listitem_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/dark" Android:state_pressed="true" />
<item Android:drawable="@color/dark" Android:state_focused="true" />
<item Android:drawable="@Android:color/white" />
</selector>
anstatt:
Android:drawable="@color/transparent"
schreiben
Android:drawable="@Android:color/transparent"
Sie können ein Thema schreiben:
<pre>
Android:name=".List10" Android:theme="@style/Theme"
theme.xml
<style name="Theme" parent="Android:Theme">
<item name="Android:listViewStyle">@style/MyListView</item>
</style>
styles.xml
<style name="MyListView" parent="@Android:style/Widget.ListView">
<item name="Android:listSelector">@drawable/my_selector</item>
my_selector ist Ihr Wunsch nach benutzerdefiniertem Selektor. Es tut mir leid, dass ich nicht weiß, wie ich meinen Code schreiben soll
Ich bin mir nicht sicher, wie Sie den gewünschten Effekt über den Selektor selbst erzielen können - schließlich gibt es per Definition einen Selektor für die gesamte Liste.
Sie können jedoch die Auswahländerungen steuern und nach Belieben zeichnen. In dieses Beispielprojekt mache ich die Auswahl transparent und zeichne einen Balken auf das ausgewählte Element.
Ich benutze immer die gleiche Methode und sie funktioniert immer und überall: Ich benutze einfach einen Selektor wie diesen
<item Android:state_activated="true" Android:color="@color/your_selected_color" />
<item Android:state_pressed="true" Android:color="@color/your_pressed_color" />
<item Android:color="@color/your_normal_color"></item>
und setzen Sie in der ListView (DIESE IS SEHR WICHTIG, UM ES FUNKTIONIEREN ZU LASSEN) das Attribut
Android:choiceMode="singleChoice"
für die textColor legen Sie einfach in den Farbordner (WICHTIG, nicht zeichnbarer Ordner!) einen Selektor wie diesen
<item Android:state_activated="true" Android:color="@color/your_selected_textColor" />
<item Android:state_pressed="true" Android:color="@color/your_pressed_textColor" />
<item Android:color="@color/your_normal_textColor"></item>
dies ist eine Beispielzeilenvorlage
<ImageView
Android:id="@+skinMenu/lblIcon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center_horizontal"
Android:src="@drawable/menu_catalog" />
<TextView
Android:id="@+skinMenu/lblTitle"
style="@style/superlabelStyle"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_marginLeft="20dp"
Android:gravity="center_vertical"
Android:text="test menu testo"
Android:textColor="@color/menu_textcolor_selector"
Android:textSize="20dp"
Android:textStyle="bold" />
alles funktioniert ohne langwierige Umgehungen. Ich hoffe das hilft