2012-07-26 30 views
13

Tengo un selector dibujable como fondo para cada elemento en un ListView para resaltar la fila seleccionada. Todo funciona bien en Ice Cream Sandwich, pero parece que no funciona en Jelly Bean. No puedo encontrar ninguna documentación que indique qué cambios podrían haber causado que deje de funcionar y qué debo hacer para solucionarlo.El selector Drawable no funciona en Jelly Bean

Al no funcionar, me refiero a cuando hago clic en una fila en el ListView el color de fondo del elemento no está cambiando el color @color/blue, pero lo hace en ICS.

Este es el código que estoy usando el selector (listing_selector.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android" > 

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

    <item android:state_pressed="true" android:drawable="@color/blue" /> 

    <item android:state_activated="true" android:drawable="@color/blue_selected" /> 

    <item android:state_selected="true" android:drawable="@color/blue_selected" /> 

    <item android:drawable="@android:color/transparent" /> 

</selector> 

Ésta es la disposición del elemento ListView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:background="@color/listing_selector"  
> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
    /> 

</RelativeLayout> 

Esta el recurso de color azul:

<resources> 
    <color name="blue">#ff33b5e5</color>  
</resources> 

ACTUALIZACIÓN 1:

intentado mover el selector de la carpeta color a la carpeta drawable y actualizar el código para esto:

android:background="@drawable/listing_selector" 

ACTUALIZACIÓN 2:

Además, en el ListView, intentado añadir esto:

<ListView android:id="@android:id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:listSelector="@drawable/listing_selector" 
    /> 

ACTUALIZACIÓN 3:

Pensé que podría ser algo en mi código, pero eliminé todo el código de onListItemClick del ListView y todavía el selector no está funcionando.

ACTUALIZACIÓN 4:

me he reducido a state_selected o state_activated que no funciona como, state_pressed parece estar funcionando

Update 5:

creo que estaba equivocado . No creo que el selector sea reconocido, en absoluto. Estaba confundiendo el ListView resaltado incorporado como mi selector. Ahora me pregunto si tiene algo que ver con la configuración de mi proyecto. Tengo el selector en una clase de biblioteca. Tal vez algo cambió con eso de ICS a JB, sin embargo, mover el selector al proyecto de mi aplicación no pareció solucionarlo.

ACTUALIZACIÓN 6:

Ok, después de tirar un poco más el pelo, me he reducido, de nuevo, ya sea a state_selected o state_activated no ser reconocido, como cambiar el color de state_pressed funciona, lo que significa mi selector está siendo reconocido. De los comentarios parece ser algo con mi aplicación específicamente, ya que otros han podido conseguir selectores trabajando con Jelly Bean.

Aunque hay algo más que es interesante es que no se reconoce el cambio del valor de drawable para el estado predeterminado. Donde tengo color/transparent, pensaría que cambiar eso a un color haría que el listado cambiara a ese color, pero no es así.

Además, esto tampoco funciona en ICS.

ACTUALIZACIÓN 7:

Después de tirar aún más el pelo, he descubierto que, con una presión prolongada sobre un elemento de menú resultados en el color de ese artículo está cambiando. Simplemente haciendo clic en un elemento todavía no funciona. Ni siquiera estoy seguro de lo que significa.

** Actualización final: **

me rindo, me quita el selector y sólo estoy refrescando la ListView de clic y recordar la posición de clic y resaltando desde el código. No es ideal, pero no vale la pena el esfuerzo para intentar arreglarlo.

+0

Cuando intentó su ACTUALIZACIÓN 2, ¿eliminó el android: fondo de su elemento de la lista. Utilizo android: listSelector para la lista, y luego no android: background se define para el elemento de la lista; y todo funciona para mi Además, no estoy seguro de si está relacionado, pero también tengo Android: cacheColorHint = "@ null". – Chris

+0

@Chris Yea, probé que tampoco funcionó. Agregué una nueva actualización (# 5). Me pregunto si el problema es con la forma en que tengo la configuración de mi proyecto. –

+0

La configuración del proyecto no debe estar relacionada con este problema, suponiendo que tenga sus dependencias de Android mostrando ... qué eclipse básicamente lo obliga a hacer. Sugerencia sobre la cosa dibujable vs color, use android: color para selectores xml en res/color, y android: dibujable para selectores xml en res/dibujable. Por lo que tiene probablemente no haya ninguna razón para usarlo como dibujable en lugar de como color. Y los colores implícitamente tienen opacidad completa, por lo que # ff33b5e5 es lo mismo que # 33b5e5 – syklon

Respuesta

1

listing_selector.xml debe estar en res/drawable carpeta y establecer el atributo android:background de su RelativeLayout así:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:background="@drawable/listing_selector"  
> 
+0

Se movió el 'listing_selector.xml' a la carpeta' res/drawable', pero aún no funciona. –

+0

@KrisB K_Anas estaba enfatizando esta línea: '@ drawable/listing_selector'. –

+0

@SherifelKhatib no estoy seguro de lo que quiere decir. Moví 'listing_selector.xml' a' res/drawable' y cambié esa línea de código de 'android: background =" @ color/listing_selector "' to 'android: background =" @ dibujable/listing_selector "'. ¿Me estoy perdiendo algo más? –

0

no puedo decir que la razón por la cual su trabajo en una versión y no trabajar en otro, pero me dieron una alternativa solución.

definir su color como en dibujable recursos

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <drawable name="blue">#00F</drawable> 
    ... 
</resources> 

uso de este color estirable en su selector de

<?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/blue" /> 
    ... 
    ... 
</selector> 

Prueba esto y quiero saber.

2

De acuerdo, creo que es un problema con su selector. Intente eliminar state_focused y state_activated. Usted podría intentar esto para su selector:

<!-- Disabled State --> 
<item 
    android:state_enabled = "false" 
    android:state_focused = "true" 
    android:state_pressed = "true" 
    android:drawable="@android:color/transparent"> 
</item> 
<item 
    android:state_enabled = "false" 
    android:state_focused = "true" 
    android:drawable="@android:color/transparent"> 
</item> 

<!-- Pressed State --> 
<item 
    android:state_pressed = "true" 
    android:state_focused = "true"> 
    <shape> 
     <solid android:color="@color/blue"/> 
    </shape> 
</item> 
<item 
    android:state_pressed = "true" 
    android:state_focused = "false"> 
    <shape> 
     <solid android:color="@color/blue"/> 
    </shape> 
</item> 

<!-- Normal State --> 
<item 
    android:drawable="@android:color/transparent"> 
</item> 

encontré que tenía que utilizar un objeto de forma demasiado en lugar de android:drawable, porque en los teléfonos pre-ICS, toda la lista se resaltará que el color en lugar de la lista presionado ít.

También puede agregar su código state_selected, pero no estoy seguro de cómo se usará. Consulte el código de selector predeterminado para jelly bean para los estados que utilizan: list_selector_background.xml.

0

¡¡Creo que funciona bien !!

el selector de código del archivo xml: -

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

     <item android:drawable="@color/gray" android:state_focused="true"/> 
     <item android:drawable="@color/gray" android:state_pressed="true"/> 
     <item android:drawable="@color/orange" android:state_activated="true"/> 
     <item android:drawable="@color/orange" android:state_selected="true"/> 
     <item android:drawable="@color/orange"/> 

    </selector> 

ahora crear una carpeta valores-v16 en la carpeta res y poner este archivo de colores en ella.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <color name="gray">#4f4f4f</color> 
    <color name="orange">#e26c0e</color> 

</resources> 

y luego la vista de lista:

<ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="20dp" 
     android:listSelector="@drawable/listing_selector" > 
</ListView> 

Hope esto funciona! Probado en la versión 4.1

+0

la única diferencia que he encontrado es que he colocado el archivo de colores en values-v16. – Chandrashekhar

+0

Gracias, debe haber algo mal con la forma en que se configura mi proyecto, así que estoy pensando que nada ha cambiado en Jelly Bean. Aún así, necesito trabajar en ello. –

0

Desde el API Docs:

Nota: Recuerde que Android se aplica el primer elemento de la lista del estado que coincide con el estado actual del objeto. Por lo tanto, si el primer elemento en la lista no contiene ninguno de los atributos de estado anteriores, entonces es aplicado cada vez, por lo que su valor predeterminado siempre debe ser último (como se muestra en el siguiente ejemplo).

Por lo tanto, intente reordenar los estados de sus selectores de acuerdo con el orden sugerido. En su caso, esto sería este:

<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true" android:drawable="@color/blue" /> 
    <item android:state_focused="true" android:drawable="@color/blue" /> 
    <item android:state_selected="true" android:drawable="@color/blue_selected" /> 
    <item android:state_activated="true" android:drawable="@color/blue_selected" /> 
    <item android:drawable="@android:color/transparent" /> 
</selector> 
Cuestiones relacionadas