47 votes

ListSelector s'applique à la liste entière

J'ai une simple liste avec un sélecteur de liste comme ça.

 <ListView android:id="@+id/list" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:layout_below="@+id/round"
    android:listSelector="#99000000" android:clickable="true" android:cacheColorHint="#00000000" android:background="#00000000">
</ListView>
 

Comme vous pouvez le voir avec android: listSelector = "# 99000000" mais la couleur "black alpha" est appliquée à toute la liste, pas à l'élément sélectionné.


C'est donc ce que j'ai maintenant mais la liste entière devient noire

:: listview_background.xml

 <?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/list_normal" />
  <item android:state_pressed="true"
        android:drawable="@drawable/list_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/list_active" />
</selector>
 

:: couleurs.xml

 <resources>
    <drawable name="list_normal">#96FFFFFF</drawable>
    <drawable name="list_active">#66000000</drawable>
    <drawable name="list_pressed">#CA000000</drawable>
</resources>
 

:: le tag xml dans ma liste

 android:listSelector="@drawable/listview_background"
 

89voto

Pilot_51 Points 2880

J'ai eu ce même problème et tout en regardant l'un de la plate-forme drawable fichiers XML, j'ai remarqué un moyen d'éliminer le besoin de créer un fichier image juste pour une couleur, par la création d'une forme de XML.

Par exemple, au lieu de:

<item android:state_focused="true"
      android:drawable="@drawable/list_active" />

Faire:

<item android:state_focused="true">
    <shape>
        <solid android:color="#66000000" />
    </shape>
</item>

Au-delà de la simple création d'une plaine de couleur drawable, la forme est souple, semblable à un simple objet vectoriel. Tous les détails peuvent être trouvés ici: http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

28voto

Eric Points 886

J'ai eu le même problème. J'ai une image de fond personnalisée, et je ne veux pas avoir à faire des variantes de l'image d'arrière-plan parce que ce serait fastidieux de tous les différents états.

Alors je veux faire la chose la plus évidente, ont une semi-transparence de la barre qui est superposé sur le dessus de la listitem et lorsque l'utilisateur appuie sur la touche "entrée" ou que ce soit, il clignote pour la touche de couleur de superposition qui est plus frappant, et un peu plus opaque.

La solution était de rester à l'écart de tout @couleur ou @drawable qui fait référence à une couleur de l'intérieur listSelector. J'ai créé deux 3x3 pixels .les fichiers png. Chaque enregistré avec le gamma de la couche. Dans mon cas, c'est deux de la même couleur chaque mixées dans Gimp avec un autre de transparence sur la couche de couleur. Ainsi, lorsque vous sélectionnez un élément, vous obtenez une superposition avec 25% de couleur, et lorsque vous appuyez sur ce bouton, vous obtenez un png avec 50% de couleur. Je les ai mis dans mon un drawable comme bg_list_item_pressed.png et bg_list_item_highlighted.png

Puis j'ai mis ma liste de sélection:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <!-- Selected --> 
  <item 
    android:state_focused="true" 
    android:state_pressed="false" 
    android:drawable="@drawable/bg_list_item_highlighted" /> <!--  @drawable/tab_focus -->

  <!-- Pressed -->
  <item 
    android:state_pressed="true" 
    android:drawable="@drawable/bg_list_item_pressed" /> <!--  @drawable/tab_press -->

</selector> 

Ensuite, j'ai ajouté mon listSelector attributs de ma ListView dans ma mise en page xml:

android:listSelector="@drawable/list_selector"
android:drawSelectorOnTop="true"

Maintenant, il fonctionne exactement de la façon dont je veux qu'il fonctionne. Y compris en utilisant le D-pad pour sélectionner une ligne, et cliquez dessus avec la touche enter. Obtenir la mise en évidence et suivantes en appuyant sur les couleurs exactement comment ils devraient l'être.

17voto

worked Points 2005

Si vous configurez une disposition des lignes pour chaque élément de la liste, voici comment je le fais. Notez la valeur transparente définie pour le listSelector. (Par souci de brièveté, j'ai supprimé le fichier colors.xml.)

main.xml

 <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:listSelector="#00000000"/>
</LinearLayout>
 

row.xml

 <FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/row"
  android:layout_width="fill_parent"
  android:layout_height="?android:attr/listPreferredItemHeight"
  android:background="@drawable/list_selector">
  ...
</FrameLayout>
 

list_selector.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="#66FFFFFF" />
    <item android:drawable="#FF666666"/> 
</selector>
 

2voto

Christopher Orr Points 58514

La liste de sélection est un StateListDrawable — il contient des références à plusieurs un drawable pour chaque état la liste peut être, comme sélectionné, concentré, pressé, les handicapés...

Dans votre cas, par la définition d'une seule couleur, la liste est dessin #9000 pour chaque état unique.

Vous avez besoin de définir un StateListDrawable comme décrit ci-dessus, avec XML similaire à la suivante. C'est ce que vous définissez dans votre android:listSelector d'attribut.

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

Ou, pour définir le même sélecteur liste de toutes les listes dans votre application, vous pouvez remplacer le sélecteur en Widget.ListView thème:

<style name="Widget.ListView" parent="Widget.AbsListView">
  <item name="android:listSelector">@drawable/my_custom_selector</item>
</style>

2voto

noobular Points 256

Jax,

J'essayais de comprendre pourquoi ma liste entière était en train de changer de couleur réglage de la listSelector, et a trouvé que c'est exactement ce qu'il est censé faire, c'est à dire de la définition de la couleur pour l'ensemble de la liste, et non pas la ligne qui est ce que nous voulons.

Ici est ce que vous voulez faire: Je suppose que vous avez une liste définie en XML. Et pour cette liste, je suppose que vous êtes à l'aide d'un adaptateur pour définir présenter les données. Aussi pour cette carte, vous utilisez une ligne de vue est définie en XML. Ce que vous voulez faire est de définir l'arrière-plan de cet élément de ligne comme ceci:

<?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="fill_parent"
    android:orientation="horizontal"
    android:background="@drawable/textview_selector">
        <TextView       android:id="@+id/textForList"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        android:padding="10sp"  />
</LinearLayout>

Voici mon textview_selector.xml stockées dans drawable:

<?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/teal" />
    <item android:drawable="@drawable/white" />
</selector>

Espérons que cette aide

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