Un ColorStateList
es un objeto que puedes definir en formato XML y aplicar como color, pero que cambiará de color según el estado del objeto View
al que se aplique. Por ejemplo, un widget Button
puede existir en uno de varios estados (presionado, enfocado o ninguno) y, utilizando una lista de estados de color, puedes proporcionar un color diferente durante cada estado.
Puedes describir la lista de estados en un archivo en formato XML. Cada color se define en un elemento <item>
dentro de un único elemento <selector>
. Cada <item>
usa distintos atributos para describir el estado en el que debe usarse.
Durante cada cambio de estado, se recorre de arriba abajo la lista de estados, y se utilizará el primer elemento que coincida con el estado actual; la selección no depende de la "mejor coincidencia", sino del primer elemento que cumple con los criterios mínimos del estado.
Nota: Si deseas proporcionar un recurso de color estático, usa un valor simple de Color.
- ubicación del archivo:
res/color/filename.xml
Se utilizará el nombre de archivo como ID de recurso.
- tipo de datos de recursos compilados:
- Puntero de recursos a un
ColorStateList
.
- referencia del recurso:
-
En Java:
R.color.filename
En XML: @[package:]color/filename
- sintaxis:
-
<?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>
- Obligatorio. Debe ser el elemento raíz. Contiene uno o más elementos
<item>
.
atributos:
xmlns:android
- String. Obligatoria. Define el espacio de nombres XML, que debe ser
"http://schemas.android.com/apk/res/android"
.
<item>
- Define un color para usar durante ciertos estados, según la descripción de sus atributos. Tiene que ser un elemento secundario de un elemento
<selector>
.
atributos:
android:color
- Color hexadecimal. Obligatorio. El color se especifica con un valor RGB y un canal Alfa opcional.
El valor siempre comienza con un carácter numeral (#), seguido de la información Alfa-Rojo-Verde-Azul en uno de los siguientes formatos:
- #RGB
- #ARVA
- #RRVVAA
- #AARRGGBB
android:lStar
- Punto flotante. Opcional. Este atributo modifica la luminancia perceptual del color de base. Toma un valor de punto flotante entre 0 y 100 o un atributo de tema que se resuelve como tal. El color general del elemento se calcula convirtiendo el color de base en un espacio de color con mayor accesibilidad y configurando su L* en el valor que se especifica en el atributo
lStar
.
Ejemplo: android:lStar="50"
android:state_pressed
- Booleano. Es "verdadero" si se debe usar este elemento cuando se presiona el objeto (por ejemplo, cuando se toca o se hace clic en un botón). Es "falso" si se debe usar en el estado predeterminado, sin presionar.
android:state_focused
- Booleano. Es "verdadero" si se debe usar este elemento cuando el objeto está enfocado (como cuando se resalta un botón usando la bola de seguimiento o el pad direccional). Es "falso" si se debe utilizar en el estado predeterminado no enfocado.
android:state_selected
- Booleano. Es "verdadero" si se debe usar este elemento cuando se selecciona el objeto (como cuando se abre una pestaña). Es "falso" si se debe usar cuando el objeto no está seleccionado.
android:state_checkable
- Booleano. Es "verdadero" si este elemento debe usarse cuando el objeto se pueda marcar. Es "falso" si este elemento debe usarse cuando el objeto no se puede marcar. (Solo es útil si el objeto puede hacer la transición entre un widget que se puede marcar y uno que no).
android:state_checked
- Booleano. Es "verdadero" si este elemento debe usarse cuando se marca el objeto. Es "falso" si este elemento debe usarse cuando el objeto no está marcado.
android:state_enabled
- Booleano. Es "verdadero" si el elemento debe usarse cuando el objeto está habilitado (cuando puede recibir eventos táctiles o de clic). Es "falso" si este elemento debe usarse cuando el objeto está inhabilitado.
android:state_window_focused
- Booleano. Es "verdadero" si este elemento debe usarse cuando la ventana de la aplicación se halla enfocada (la aplicación está en primer plano). Es "falso" si este elemento debe usarse cuando la ventana de la aplicación no se halla enfocada (por ejemplo, si se abre el panel de notificaciones o aparece un diálogo).
Nota: Recuerda que se aplicará el primer elemento de la lista de estados que coincida con el estado actual del objeto. Así, si el primer elemento de la lista no contiene ninguno de los atributos de estado anteriores, se aplicará cada vez, por lo que tu valor predeterminado siempre debe ser el último, como se muestra en el siguiente ejemplo.
- ejemplo:
- Archivo en formato XML guardado en
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 diseño XML aplicará la lista de colores a un elemento View:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:textColor="@color/button_text" />
- consulta también:
-