2010-08-28 15 views
108

Estoy intentando cambiar el color de fondo de un widget de Android TextView cuando el usuario lo toca. He creado un selector para tal fin, que se almacena en res/color/selector.xml y más o menos se parece a lo siguiente:Selector en el color de fondo de TextView

<?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 atributo clickable del TextView es true, en caso que es de su interés.

Cuando le asigno este selector a un TextView como android:background="@color/selector", estoy recibiendo la siguiente excepción en tiempo de ejecución:

ERROR/Android Runtime (13130): Causado por: org.xmlpull.v1.XmlPullParserException: Binario línea de archivo XML # 6: etiqueta requiere una etiqueta de atributo o niño dibujable 'definir un dibujable

Cuando cambio el atributo a estirable, funciona, pero el resultado está buscando completamente equivocado, porque las identificaciones parecen ser interpretado como referencias de imagen en lugar de referencias de color (como las "dibujables" uggests).

Lo que me confunde es que puedo establecer una referencia de color, p. "@ color/black", como atributo de fondo directamente. Esto está funcionando como se esperaba. Usar selectores no funciona.

También puedo usar el selector como textColor sin problemas.

¿Cuál es la forma correcta de aplicar un selector de color de fondo a un TextView en Android?

+0

Un color se puede interpretar como dibujable. ¿Cómo es el resultado incorrecto exactamente? –

+0

No muestra el color sino una imagen de mis recursos dibujables como fondo. – digitalbreed

+2

Lo anterior debería funcionar, si usas android: drawable, no android: color - al menos en ese caso funciona para mí: android: drawable = "@ color/my_custom_color". Mis colores están definidos en valores/colors.xml – AgentKnopf

Respuesta

194

El problema aquí es que no puede definir el color de fondo con un selector de color, necesita un selector dibujable. Por lo tanto, los cambios necesarios se vería así:

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

También tendría que mover ese recurso al directorio drawable donde tendría más sentido ya que no es un selector de color por sí.

Entonces usted tiene que crear el archivo res/drawable/selected_state.xml así:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="@color/semitransparent_white" /> 
</shape> 

y, finalmente, se usaría así:

android:background="@drawable/selector" 

Nota: la razón por la OP fue obtener un recurso de imagen dibujado es probablemente porque intentó simplemente hacer referencia a su recurso que todavía estaba en el directorio de color pero usando @drawable, por lo que terminó con una colisión de identificación, seleccionando el recurso equivocado.

Espero que esto todavía pueda ayudar a alguien, incluso si el OP probablemente, ahora, ha resuelto su problema.

+1

Gracias, Benoit. El problema fue resuelto (debo admitir, no recuerdo cómo exactamente lo hice al final) y el proyecto se terminó con éxito. Aprecio que haya regresado aquí para publicar y ayudar a las personas a enfrentar el mismo problema en el futuro, ¡gran espíritu! – digitalbreed

+0

No puedo hacer que esto funcione. Estoy intentando aplicarlo a un botón y establece el fondo en el color predeterminado del selector, pero no cambia a la forma definida en state_pressed. ¿Qué podría estar perdiendo? Podría abrir una nueva pregunta, solo en caso de que pudieras señalarme en la dirección correcta. – Maragues

+0

@Maragues es difícil de decir sin ver ningún código. Te recomendaría que abrieras una nueva pregunta y publicaras el código correspondiente para que podamos descubrir qué podría estar mal. Puedes agregar un comentario a esta publicación con un enlace a tu nueva publicación también. –

101

La solución de Benoit funciona, pero realmente no necesita incurrir en gastos generales para dibujar una forma. Como los colores pueden ser dibujables, simplemente defina un color en a/res/values ​​/ colors.archivo xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="semitransparent_white">#77ffffff</color> 
</resources> 

y luego usar como tal en el selector:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_pressed="true" 
     android:drawable="@color/semitransparent_white" /> 
</selector> 
+0

Por alguna razón, su solución no muestra el color sino una imagen aleatoria de mi carpeta de recursos dibujables. Intenté limpiar el proyecto/arreglar propiedades/guardar/volver a abrir eclipse, ya que parece realmente extraño, pero t en vano. Extraño. – Yahel

+0

@Yahel Posiblemente llamó al recurso dibujable en color lo mismo que un archivo dibujable real? – Jona

+0

@Jona: No, pero el dibujable se llamaba background_application y el dibujable de color se llamaba background_white_transparent. Ambos tenían antecedentes en ellos ... He visto en otro hilo que a otros le pasa lo mismo, así que lo archivé como uno de los numerosos errores de Android y renové todo el diseño para solucionarlo. – Yahel

78

Una solución aún más simple de lo anterior:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <color android:color="@color/semitransparent_white" /> 
    </item> 
    <item> 
     <color android:color="@color/transparent" /> 
    </item> 
</selector> 

Guardar que en la carpeta estirable y' está bien para ir.

+1

Quizás esto funcione, pero oficialmente no es compatible (Android Studio lo trata como un error). – Blackhex

+0

@Blackhex Extraño. Funciona bien para mí en Eclipse. Probablemente sea un error de Lint, y si lo es, debería poder deshabilitarlo o ignorarlo. –

+4

Esto es lo que consideraría la solución. –

14

Incluso esto funciona.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" /> 
    <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" /> 
    <item android:drawable="@android:color/white" /> 
</selector> 

he añadido el atributo android:drawable a cada elemento y sus valores son los colores.

Por cierto, ¿por qué dicen que color es uno de los atributos de selector? No escriben que se requiere android:drawable.

Color State List Resource

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:color="hex_color" 
     android:state_pressed=["true" | "false"] 
     android:state_focused=["true" | "false"] 
     android:state_selected=["true" | "false"] 
     android:state_checkable=["true" | "false"] 
     android:state_checked=["true" | "false"] 
     android:state_enabled=["true" | "false"] 
     android:state_window_focused=["true" | "false"] /> 
</selector> 
+0

atributo de color funciona cuando configura colores de vista de texto pero no con fondo ya que en realidad los colores en el fondo funcionan como ColorDrawable –

+0

La mejor y más fácil solución para implementar todos los anteriores. – 4gus71n

1

Para quien está en busca de hacerlo sin crear un sector de fondo, sólo tiene que añadir estas líneas a la TextView

android:background="?android:attr/selectableItemBackground" 
android:clickable="true" 

también para que sea el uso seleccionable:

android:textIsSelectable="true" 
Cuestiones relacionadas