Estoy intentando cambiar el color de fondo de un TextView
widget de Android cuando el usuario lo toca. He creado un selector para ese propósito, que se almacena res/color/selector.xml
y se ve más o menos así:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:color="@color/semitransparent_white"
/>
<item
android:color="@color/transparent"
/>
</selector>
El clickable
atributo de TextView
estrue
, en caso de que sea de interés.
Cuando asigno este selector a un TextView
as android:background="@color/selector"
, obtengo la siguiente excepción en tiempo de ejecución:
ERROR / AndroidRuntime (13130): Causado por: org.xmlpull.v1.XmlPullParserException: archivo XML binario línea # 6: la etiqueta requiere un atributo 'dibujable' o etiqueta secundaria que defina un dibujable
Cuando cambio el atributo a dibujable, funciona, pero el resultado parece completamente incorrecto porque los ID parecen interpretarse como referencias de imagen en lugar de referencias de color (como sugiere el "dibujable").
Lo que me confunde es que puedo establecer una referencia de color, por ejemplo, "@ color / negro", como el atributo de fondo directamente. Esto está funcionando como se esperaba. Usar selectores no funciona.
También puedo usar el selector textColor
sin problemas.
¿Cuál es la forma correcta de aplicar un selector de color de fondo a un TextView
en Android?
Respuestas:
El problema aquí es que no puede definir el color de fondo con un selector de color, necesita un selector que se pueda dibujar . Entonces, los cambios necesarios se verían así:
También necesitaría mover ese recurso al
drawable
directorio donde tendría más sentido ya que no es un selector de color per se.Entonces tendrías que crear el
res/drawable/selected_state.xml
archivo así:y finalmente, lo usarías así:
Nota : la razón por la cual el OP estaba obteniendo un recurso de imagen dibujado probablemente es porque trató de hacer referencia a su recurso que todavía estaba en el directorio de colores pero lo usó
@drawable
y terminó con una colisión de ID, seleccionando el recurso incorrecto.Espero que esto pueda ayudar a alguien, incluso si el OP probablemente haya resuelto su problema, espero.
fuente
La solución de Benoit funciona, pero realmente no es necesario incurrir en gastos generales para dibujar una forma. Como los colores pueden ser dibujables, solo defina un color en un archivo /res/values/colors.xml:
Y luego utilícelo como tal en su selector:
fuente
Una solución aún más simple a lo anterior:
Guarde eso en la carpeta dibujable y listo.
fuente
<item android:state_pressed="true" android:color="@color/vantablack"/>
parece semánticamente idéntico a<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
Incluso esto funciona.
Agregué el
android:drawable
atributo a cada elemento, y sus valores son colores.Por cierto, ¿por qué dicen que
color
es uno de los atributos deselector
? Ellos no escriben esoandroid:drawable
se requiere.Recurso de lista de estado de color
fuente
Para quién está buscando hacerlo sin crear un sector de fondo, simplemente agregue esas líneas al
TextView
También para hacer uso seleccionable:
fuente