Estou tentando alterar a cor de segundo plano de um TextView
widget Android quando o usuário toca nele. Eu criei um seletor para esse fim, que é armazenado res/color/selector.xml
e mais ou menos assim:
<?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>
O clickable
atributo do TextView
é true
, caso isso seja interessante.
Quando atribuo esse seletor a um TextView
as android:background="@color/selector"
, estou recebendo a seguinte exceção em tempo de execução:
ERROR / AndroidRuntime (13130): Causado por: org.xmlpull.v1.XmlPullParserException: Arquivo XML binário linha # 6: tag requer um atributo 'drawable' ou marca filho que define um drawable
Quando altero o atributo para drawable, ele funciona, mas o resultado parece completamente errado porque os IDs parecem ser interpretados como referências de imagem em vez de referências de cores (como sugere o "drawable").
O que me confunde é que eu posso definir uma referência de cor, por exemplo "@ color / black", como o atributo background diretamente. Isso está funcionando como esperado. O uso de seletores não funciona.
Também posso usar o seletor como textColor
sem problemas.
Qual é a maneira correta de aplicar um seletor de cores de fundo a um TextView
no Android?
Respostas:
O problema aqui é que você não pode definir a cor do plano de fundo usando um seletor de cores; você precisa de um seletor desenhável . Portanto, as alterações necessárias seriam assim:
Você também precisaria mover esse recurso para o
drawable
diretório em que faria mais sentido, pois não é um seletor de cores em si.Então você teria que criar o
res/drawable/selected_state.xml
arquivo assim:e, finalmente, você usaria assim:
Nota : a razão pela qual o OP estava obtendo um recurso de imagem desenhado é provavelmente porque ele tentou apenas referenciar seu recurso que ainda estava no diretório de cores, mas usando-o
@drawable
para terminar com uma colisão de ID, selecionando o recurso errado.Espero que isso ainda possa ajudar alguém, mesmo que o OP provavelmente já tenha resolvido o problema.
fonte
A solução da Benoit funciona, mas você realmente não precisa incorrer na sobrecarga para desenhar uma forma. Como as cores podem ser desenhadas, basta definir uma cor no arquivo /res/values/colors.xml:
E use como tal em seu seletor:
fonte
Uma solução ainda mais simples para o acima exposto:
Salve isso na pasta drawable e pronto.
fonte
<item android:state_pressed="true" android:color="@color/vantablack"/>
parece semanticamente idêntico para<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
Até isso funciona.
Eu adicionei o
android:drawable
atributo a cada item e seus valores são cores.A propósito, por que eles dizem que esse
color
é um dos atributos deselector
? Eles não escrevem o queandroid:drawable
é necessário.Recurso da lista de estados de cores
fonte
Para quem está procurando fazer isso sem criar um setor em segundo plano, basta adicionar essas linhas ao
TextView
Também para torná-lo selecionável:
fonte