Estilo de checkbox de Android

Soy nuevo en Android y estoy tratando de establecer un estilo para todas las casillas de verificación en mi aplicación. El estilo de mi aplicación está configurado en Theme.Holo, que es oscuro, y me gustaría que las casillas de verificación en mi vista de lista sean de estilo Theme.Holo.Light. No estoy tratando de crear un estilo personalizado. El código siguiente no parece funcionar, nada sucede en absoluto. Necesito hacer esto porque mi vista de lista tiene una textura de papel claro y la checkbox y el texto de la checkbox son blancos, lo que me gustaría que fuera oscuro.

 @style/customCheckBoxStyle    

¿También puede establecer estilos para widgets individuales si establece un estilo para la aplicación?

Nota : ¿Utiliza la biblioteca de soporte de Android v22.1.0 y la API de segmentación de nivel 11 y superior? Desplácese hacia abajo hasta la última actualización.


El estilo de mi aplicación está configurado en Theme.Holo, que es oscuro, y me gustaría que las casillas de verificación en mi vista de lista sean de estilo Theme.Holo.Light. No estoy tratando de crear un estilo personalizado. El código siguiente no parece funcionar, nada sucede en absoluto.

Al principio puede no ser evidente por qué el sistema exhibe este comportamiento, pero cuando realmente observas la mecánica, puedes deducirlo fácilmente. Déjame guiarte paso a paso.

Primero, echemos un vistazo a lo que define el estilo Widget.Holo.Light.CompoundButton.CheckBox . Para aclarar las cosas, también agregué la definición de estilo “regular” (no liviano).

   

Como puede ver, ambas son declaraciones vacías que simplemente Widget.CompoundButton.CheckBox con un nombre diferente. Así que echemos un vistazo a ese estilo de padres.

  

Este estilo hace referencia tanto a un fondo como a un botón dibujables. btn_check_label_background es simplemente un parche de 9 y por lo tanto no es muy interesante con respecto a este asunto. Sin embargo ?android:attr/listChoiceIndicatorMultiple indica que algún atributo basado en el tema actual (esto es importante de realizar) determinará el aspecto real de CheckBox .

Como listChoiceIndicatorMultiple es un atributo de tema, encontrará varias declaraciones para él, una para cada tema (o ninguna si se hereda de un tema principal). Esto se verá de la siguiente manera (con otros atributos omitidos para mayor claridad):

    

Así que aquí donde ocurre la verdadera magia: en función del atributo listChoiceIndicatorMultiple del tema, se listChoiceIndicatorMultiple la apariencia real de CheckBox . El fenómeno que estás viendo ahora se explica fácilmente: dado que la apariencia está basada en temas (y no en estilos, porque eso es meramente una definición vacía) y estás heredando de Theme.Holo , siempre obtendrás la apariencia de CheckBox coincidiendo con el tema

Ahora, si desea cambiar el aspecto de su CheckBox a la versión de Holo.Light, deberá tomar una copia de esos recursos, agregarlos a sus activos locales y usar un estilo personalizado para aplicarlos.

En cuanto a su segunda pregunta:

¿También puede establecer estilos para widgets individuales si establece un estilo para la aplicación?

Absolutamente, y anularán cualquier estilo de actividad o conjunto de aplicaciones.

¿Hay alguna manera de establecer un tema (estilo con imágenes) para el widget de checkbox. (...) ¿Hay alguna forma de usar este selector: link ?


Actualizar:

Permítanme comenzar diciendo nuevamente que no se supone que dependan de los recursos internos de Android. Hay una razón por la que no puedes acceder al espacio de nombres interno como desees.

Sin embargo, una forma de acceder a los recursos del sistema después de todo es haciendo una búsqueda de id por nombre. Considere el siguiente fragmento de código:

 int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android"); ((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id); 

La primera línea realmente devolverá la identificación del recurso del recurso btn_check_holo_light . Como establecimos anteriormente que este es el selector de botón que determina el aspecto de CheckBox , podemos configurarlo como "botón que se puede dibujar" en el widget. El resultado es un CheckBox con la apariencia de la versión Holo.Light , sin importar el tema / estilo que establezca en la aplicación, actividad o artilugio en xml. Como esto establece solo el botón dibujable, deberá cambiar manualmente otro estilo; por ejemplo, con respecto a la apariencia del texto.

Debajo de una captura de pantalla que muestra el resultado. La checkbox superior usa el método descrito anteriormente (configuro manualmente el color del texto en negro en xml), mientras que el segundo usa el estilo de Holo predeterminado basado en tema (no liviano, es decir).

Captura de pantalla que muestra el resultado


Actualización2:

¡Con la introducción de Support Library v22.1.0 , las cosas se han vuelto mucho más fáciles! Una cita de las notas de la versión (mi énfasis):

Lollipop agregó la capacidad de sobrescribir el tema en una vista por nivel de vista mediante el uso del atributo XML del android:theme increíblemente útil para cosas como barras de acción oscuras en actividades livianas. Ahora, AppCompat le permite usar android:theme para las Barras de herramientas (desaprobando la app:theme usado anteriormente) y, aún mejor, trae compatibilidad con android:theme a todas las vistas en dispositivos API 11+.

En otras palabras: ahora puede aplicar un tema en función de cada vista , lo que facilita enormemente la solución del problema original: simplemente especifique el tema que desea aplicar para la vista relevante. Es decir, en el contexto de la pregunta original, compare los resultados de abajo:

   

El primer CheckBox está diseñado como si se utilizara en un tema oscuro, el segundo como si fuera un tema claro, independientemente del tema real establecido para su actividad o aplicación.

Por supuesto, ya no deberías usar el tema Holo, sino usar Material.

Tal vez esto te satisfaga –

algo.xml

  

Selector

      

Para, la referencia solo se refiere aquí

La forma correcta de hacerlo para el diseño de Material es:

Estilo:

  

Diseño :

  

Conservará las animaciones de materiales en Lollipop +.

Tal vez quieras algo como:

   

Tenga en cuenta que el elemento textColor.

En la respuesta anterior también en la sección ... puede necesitar: