Recurso da lista de estados de cor

Uma ColorStateList é um objeto que você pode definir em XML que pode ser aplicado como uma cor, mas que mudará de tonalidade, dependendo do estado do objeto View em que é aplicado. Por exemplo, um widget Button pode existir em um dos vários estados diferentes (pressionado, focado ou nenhum) e, usando uma lista de cores, você pode fornecer uma cor diferente para cada estado.

Você pode descrever uma lista de estado em um arquivo XML. Cada cor é definida em um elemento <item> dentro de um elemento <selector> único. Cada <item> usa vários atributos para descrever o estado em que deve ser usado.

Durante cada mudança, a lista de estados é percorrida de cima para baixo, e o primeiro item que corresponde ao estado atual vai ser usado. A seleção não se baseia na "melhor correspondência", mas simplesmente no primeiro item que atenda aos critérios mínimos do estado.

Observação: se você quiser fornecer um recurso de cor estática, use um valor de Cor simples.

localização do arquivo:
res/color/filename.xml
O nome do arquivo vai ser usado como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um ColorStateList.
referência de recurso:
Em Java: R.color.filename
Em XML: @[package:]color/filename
sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:lStar="floating_point_value"
        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>
elementos:
<selector>
Obrigatório. Precisa ser o elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
<item>
Define a cor usada durante certos estados, como descrito pelos atributos correspondentes. Precisa ser um filho de um elemento <selector>.

atributos:

android:color
Cor hexadecimal. Obrigatório. A cor é especificada com um valor RGB e um canal alfa opcional.

O valor sempre começa com um caractere cerquilha (#) seguido pela informação Alpha-Red-Green-Blue em um dos formatos abaixo:

  • #RGB
  • #ARGB
  • #RRGGBB
  • #AARRGGBB
android:lStar
Ponto flutuante. Opcional. Esse atributo modifica a luminância perceptível da cor base. Ele usa um valor de ponto flutuante entre 0 e 100 ou um atributo de tema que é resolvido dessa forma. A cor geral do item é calculada convertendo a cor da base em um espaço de cores adequado para acessibilidade e definindo L* como o valor especificado no atributo lStar.

Exemplo: android:lStar="50"

android:state_pressed
Booleano. É definido como "true" se o item precisa ser usado quando o objeto for pressionado, por exemplo, quando um botão for pressionado ou clicado. É "false" se o item precisa ser usado no estado padrão, não pressionado.
android:state_focused
Booleano. É definido como "true" se este o precisa ser usado quando um objeto estiver em foco, por exemplo, quando um botão for destacado usando o trackball/botão direcional. É "false" se o item for usado no estado padrão, sem foco.
android:state_selected
Booleano. É definido como "true" se o item precisa ser usado quando o objeto for selecionado, por exemplo, quando uma guia for aberta. É "false" se o item precisa ser usado quando o objeto não estiver selecionado.
android:state_checkable
Booleano. É definido como "true" se o item precisa ser usado quando o objeto puder ser selecionado. É "false" se o item precisa ser usado quando o objeto não puder ser selecionado. Essa função é útil somente se o objeto puder fazer a transição entre um widget selecionável e não selecionável.
android:state_checked
Booleano. É definido como "true" se o item precisa ser usado quando o objeto estiver marcado. É "false" se ele precisa ser usado quando objeto estiver desmarcado.
android:state_enabled
Booleano. É definido como "true" se o item precisa ser usado quando o objeto for ativado (capaz de receber eventos de toque ou clique) É "false" se ele precisa ser usado quando o objeto estiver desativado.
android:state_window_focused
Booleano. É definido como "true" se o item precisa ser usado quando a janela do aplicativo estiver em foco (o aplicativo está em primeiro plano). É "false" se o item precisa ser usado quando a janela do aplicativo não tiver foco, por exemplo, se uma aba de notificações estiver suspensa ou uma caixa de diálogo for exibida.

Observação: o primeiro item na lista de estados que corresponde ao estado atual do objeto vai ser aplicado. Se o primeiro item na lista não contiver nenhum dos atributos de estados acima, ele vai ser aplicado sempre, motivo pelo qual o valor padrão precisa sempre ser o último, como demonstrado no exemplo abaixo.

Exemplo:
Arquivo XML salvo em res/color/button_text.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#ffff0000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#ff0000ff"/> <!-- focused -->
    <item android:color="#ff000000"/> <!-- default -->
</selector>

Este XML de layout vai aplicar a lista de cores a uma visualização:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/button_text"
    android:textColor="@color/button_text" />
Confira também: