web-dev-qa-db-de.com

ListView-Elementhintergrund über benutzerdefinierten Selektor

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!

97
shilgapira

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>
128
dgmltn

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:

  1. Stellen Sie den Selektor für die Elemente in der Liste ein.
  2. Beseitigen Sie den Standardselektor für die Liste.

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.

78
Michał K

Verwenden Sie niemals eine "Hintergrundfarbe" für Ihre Listenansichtszeilen ...

dies wird jede Selektoraktion blockieren (war mein Problem!)

viel Glück!

17
cV2

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).

5

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>
5
Cabezas

anstatt:

Android:drawable="@color/transparent" 

schreiben

Android:drawable="@Android:color/transparent"
4
Butters

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

4
pengwang

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.

2
CommonsWare

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

2
Apperside