Liste d'état Android ListView ne montrant pas l'arrière-plan de l'élément par défaut
Avoir lu sur un certain nombre de questions liées ici à ainsi, et regarda à travers la Android docs et de la source pour essayer de comprendre cela, mais je suis perplexe, même si, étant donné que le listSelector semble être la seule à appliquer des styles sur les éléments sélectionnés, je ne suis pas choqué...
J'ai une Listview définis dans main.xml ici:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fadingEdgeLength="5dp"
android:divider="#000000"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector" />
<TextView
android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:singleLine="false"
android:text="@string/message_list_empty" />
</FrameLayout>
La listSelector référencé est ici (emprunté en grande partie à partir de l'Android par défaut de l'Etat Liste qui se trouve dans le SDK: /android/platforms/android-8/data/res/drawable/list_selector_background.xml):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- the window has lost focus, disable the items -->
<item
android:state_window_focused="false"
android:drawable="@drawable/shape_row_disabled" />
<!-- the list items are disabled -->
<item
android:state_enabled="false"
android:state_focused="true"
android:state_pressed="true"
android:drawable="@drawable/shape_row_disabled" />
<item
android:state_enabled="false"
android:state_focused="true"
android:drawable="@drawable/shape_row_disabled" />
<item
android:state_enabled="false"
android:drawable="@drawable/shape_row_disabled" />
<!-- the list items are enabled and being pressed -->
<item
android:state_focused="true"
android:state_pressed="true"
android:drawable="@drawable/shape_row_transition" />
<item
android:state_focused="false"
android:state_pressed="true"
android:drawable="@drawable/shape_row_transition" />
<!-- the list items are enabled and being used -->
<item
android:state_focused="true"
android:drawable="@drawable/shape_row_selected" />
<!-- the default item -->
<item
android:drawable="@drawable/shape_row" />
</selector>
L'un drawable référencés sont les formes, les rectangles arrondis, comme suit:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#EF6100"
android:centerColor="#FF8E00"
android:endColor="#EF6100"
android:angle="270" />
<corners
android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp" />
</shape>
Donc, le résultat final devrait être un ListView avec des articles avec un @drawable/shape_row arrière-plan par défaut, puis différents fonds de couleur en fonction de l'état. Lorsque je lance ma liste, tout fonctionne bien en termes de lorsque les états sont en activité, comme un élément reçoit le focus, est pressée, etc, mais les objets eux-mêmes ont un arrière-plan transparent quand aucune n'est sélectionnée (c'est à dire la vue par défaut de l'état). J'avais espéré que la dernière règle de la Liste des états,
<item android:drawable="@drawable/shape_row" />
de capturer cet état, mais pour quelque raison il ne fonctionne pas. J'ai déplacé les choses autour et essayé différents réglages, et de rien. Si j'ai modifier le row.xml le fichier que j'utilise pour définir les éléments de la liste dans la liste et essayez d'ajouter un spécifique à android:background que les points de @drawable/shape_row, chaque ligne obtient le bon fond, MAIS sur pressée, à se concentrer, etc les états ne parviennent pas à traiter (ou au moins, ne peut pas être vu que le fond ne change jamais).
Quelqu'un peut me pointer dans la bonne direction? Je suis SI près de le remettre au lit, mais après avoir essayé à peu près tout, juste ne pouvez pas obtenir la liste des éléments à prendre un arrière-plan par défaut ET de répondre à la mise en œuvre de l'État de la Liste via android:listSelector.
Merci,
Paul
EDIT:
Aussi juste essayé d'ajouter android:itemBackground="@drawable/shape_row" à la ListView dans main.xml et sans surprise, pas de chance (les docs de l'état, il devrait être utilisé pour spécifier les éléments de menu' origines, mais pensé qu'il valait un coup de feu avec les éléments de la liste).
Autre chose essayé, en ajoutant android:visible="true" pour chaque sélecteur et de définitions d'éléments. Le StateListDrawable docs semblent indiquer que la "Offre initiale de l'état de visibilité de la drawable; la valeur par défaut est false"mais en ajoutant cela n'a rien changé.
EDIT2: Donc, basé sur la recherche faite ci-dessous en Qberticus, il semble qu'il ne peut y avoir qu'un seul ensemble de la liste des sélecteurs par la vue, ce qui confirme le sélecteur liste de comportement. Je peux aussi confirmer que le réglage de l'android:drawSelectorOnTop ne déplacez le sélecteur EN FACE de l'élément sélectionné, mais bien sûr, cela obscurcit l'élément lui-même tel que je ne vois que le sélecteur de lui-même (qui dans mon cas est une couleur de la forme).
Voici ce que la liste ressemble avec des arrière-plans jeu:
En raison de l'arrière-plan, il n'y a aucun changement dans l'apparence lorsque des éléments sont sélectionnés. Si je change le android:drawSelectorOnTop directive vrai et sélectionnez un élément, je reçois:
Et enfin, si je mets pas d'image de fond pour les éléments de la liste, le sélecteur fonctionne comme prévu, mais bien sûr, il n'y a pas les images de fond comme la dernière règle de la StateSelector ne semble pas être suivi (ne devrait-elle pas agir comme un fourre-tout?) pour les éléments non sélectionnés sens pas coutume bien des formes arrondies:
Donc, mon problème reste le même; si je n'ai pas définir un arrière-plan pour chaque élément de la liste, je peux voir le sélecteur de travail, MAIS les éléments n'ont pas de formation lorsqu'il n'est pas sélectionné. Si j'ai mis un arrière-plan de l'élément, ils ont fière allure lorsqu'il n'est pas sélectionné, mais l'arrière-plan occulte le sélecteur. Est-il tout simplement pas possible d'avoir une forme unique élément de la liste de travail avec les sélecteurs?
Merci pour quelqu'un d'autre qui peut de poids.
source d'informationauteur Paul Mennega
Vous devez vous connecter pour publier un commentaire.
Compris cela, le problème était que pendant que j'étais réglage de la listSelector pour la liste de la Liste des états correctement via
android:listSelector="@drawable/list_selector"
j'ai également nécessaire pour définir l'arrière-plan de l'élément de liste à une autre Liste d'État viaandroid:background="@drawable/list_background"
Dans le list_background.xml état de la liste, j'ai:
Trouvé la réponse ici:
Changement de couleur d'arrière-plan des éléments ListView sur Android
En conjonction avec ma liste sélecteur ci-dessus, il fonctionne parfaitement.
La
listSelector
est uniquement utilisée pour spécifier unView
qui sera élaboré dans le même lieu que l' sélectionné élémentView
. I. e., il n'y a qu'une seule instance de lalistSelector
parListView
. Vous pouvez spécifier si elle peut s'appuyer sur haut ou en n'utilisant pasdrawSelectorOnTop
.Si vous souhaitez que tous vos
View
s utiliser un état de la liste, alors vous devriez préciser que, lorsque l'enfantView
s sont définies.Je suis en utilisant la source pour
AbsListView
comme référence. Plus précisémentAbsListView#setSelector(Drawable)
AbsListView#positionSelector
AbsListView#drawSelector
etAbsListView#dispatchDraw
AbsListView#drawSelector
:AbsListView#positionSelector
:La source indique qu'il existe une seule
mSelector
créé/utilisé et qu'il est placé dans le même cadre rect comme le sélectionné élément.Vous pouvez affecter arrière-plan par défaut pour l'utilisateur root de mise en page et selector_background pour enfant, dans ce cas, si l'élément n'est pas sélectionné par défaut fond pas obscurcit le sélecteur. Son travail pour moi.