Estilo de la casilla de verificación de Android

Soy nuevo en android y estoy intentando establecer un estilo para todas las casillas de verificación en mi aplicación. Mi estilo de aplicación se establece en Theme.Holo que es oscuro y me gustaría que las casillas de verificación en mi lista de vista para ser de estilo Theme.Holo.Light. No estoy tratando de crear un estilo personalizado. El código de abajo no parece funcionar, no pasa nada. Tengo que hacer esto porque mi vista de lista tiene una textura de papel ligero y la casilla de verificación y el texto de la casilla de verificación es blanco que me gustaría oscuro.

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> <item name="android:checkboxStyle">@style/customCheckBoxStyle</item> </style> <style name="customCheckBoxStyle" parent="@android:style/Widget.Holo.Light.CompoundButton.CheckBox"> </style> 

También puede establecer estilos de widgets individuales si se establece un estilo a la aplicación?

Nota : ¿Utilizando la Biblioteca de soporte técnico de Android v22.1.0 y la API de orientación 11 y superior? Desplácese hasta la última actualización.


Mi estilo de aplicación se establece en Theme.Holo que es oscuro y me gustaría que las casillas de verificación en mi lista de vista para ser de estilo Theme.Holo.Light. No estoy tratando de crear un estilo personalizado. El código de abajo no parece funcionar, no pasa nada.

Al principio puede no ser evidente por qué el sistema exhibe este comportamiento, pero cuando usted mira realmente en la mecánica usted puede fácilmente deducirlo. Déjame llevarte a través de él paso a paso.

En primer lugar, echemos un vistazo a lo que define el estilo Widget.Holo.Light.CompoundButton.CheckBox . Para aclarar las cosas, también he añadido la definición de estilo "regular" (no ligero).

 <style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" /> <style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" /> 

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

 <style name="Widget.CompoundButton.CheckBox"> <item name="android:background">@android:drawable/btn_check_label_background</item> <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item> </style> 

Este estilo hace referencia tanto a un fondo como a un botón dibujable. btn_check_label_background es simplemente un 9-patch y por lo tanto no 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 darse cuenta) determinará el aspecto real del 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):

 <style name="Theme"> <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check</item> ... </style> <style name="Theme.Holo"> <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_dark</item> ... </style> <style name="Theme.Holo.Light" parent="Theme.Light"> <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_light</item> ... </style> 

Así que esto donde la verdadera magia ocurre: basado en el atributo listChoiceIndicatorMultiple del tema, se listChoiceIndicatorMultiple la apariencia real del CheckBox . El fenómeno que estás viendo ahora es fácilmente explicable: ya que la apariencia está basada en temas (y no en estilo, porque esa es simplemente una definición vacía) y estás heredando de Theme.Holo , siempre obtendrás la apariencia CheckBox Igualando el tema.

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

En cuanto a su segunda pregunta:

También puede establecer estilos de widgets individuales si se establece un estilo a 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 casilla de verificación. (…) ¿Hay alguna manera de utilizar este selector: link ?


Actualizar:

Permítanme comenzar diciendo una vez más que no se supone que dependen de los recursos internos de Android. Hay una razón por la que no puedes acceder al espacio de nombres interno como quieras.

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

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

La primera línea realmente devolverá el id de recurso del btn_check_holo_light extraíble btn_check_holo_light . Dado que establecimos anteriormente que este es el selector de botones que determina el aspecto del CheckBox , podemos configurarlo como "botón dibujable" en el widget. El resultado es un CheckBox con la apariencia de la versión de Holo.Light , sin importar qué tema / estilo establezca en la aplicación, actividad o widget en xml. Puesto que esto sólo establece el botón dibujable, tendrá que cambiar manualmente otro estilo; Por ejemplo con respecto a la apariencia del texto.

Debajo de una captura de pantalla que muestra el resultado. La casilla de verificación superior utiliza el método descrito anteriormente (el color de texto se establece manualmente en negro en xml), mientras que el segundo utiliza el estilo Holo basado en un tema predeterminado (no ligero, 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 hecho mucho más fáciles! Una cita de las notas de la versión (mi énfasis):

Lollipop añadió la capacidad de sobrescribir el tema en una vista por nivel de vista mediante el atributo XML de android:theme increíblemente útil para cosas como barras de acción oscuras en actividades de luz. Ahora, AppCompat te permite usar android:theme para Barras de herramientas (despreciando la app:theme utilizado anteriormente) y, mejor aún, trae android:theme soporte de android:theme para todas las vistas de los dispositivos API 11+.

En otras palabras: ahora puede aplicar un tema en una base por vista , lo que hace que resolver el problema original sea mucho más fácil: 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:

 <CheckBox ... android:theme="@android:style/Theme.Holo" /> <CheckBox ... android:theme="@android:style/Theme.Holo.Light" /> 

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

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

Quizás esto le satisfará –

Something.xml

 <CheckBox android:text="Custom CheckBox" android:button="@drawable/checkbox_selector" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Selector

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/star_down" /> <item android:state_checked="false" android:drawable="@drawable/star" /> </selector> 

Para, la referencia apenas refiere aquí

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

Estilo:

 <style name="MyCheckBox" parent="Theme.AppCompat.Light"> <item name="colorControlNormal">@color/foo</item> <item name="colorControlActivated">@color/bar</item> </style> 

Diseño :

 <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="Check Box" android:theme="@style/MyCheckBox"/> 

Conservará las animaciones Material en Lollipop +.

Tal vez usted quiere algo como:

 <style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> <item name="android:checkboxStyle">@style/customCheckBoxStyle</item> </style> <style name="customCheckBoxStyle" parent="@android:style/Widget.CompoundButton.CheckBox"> <item name="android:textColor">@android:color/black</item> </style> 

Tenga en cuenta, el elemento textColor.

En la respuesta anterior también en la sección <selector>...</selector> puede necesitar:

 <item android:state_pressed="true" android:drawable="@drawable/checkbox_pressed" ></item> 
  • ¿Puedo configurar los estilos personalizados globales de aplicaciones para los widgets de Android-support-design?
  • Cómo cambiar el color de texto del elemento de menú desbordamiento a un color diferente mediante el tema de la barra de acción de Sherlock
  • Cuerdas Android dependientes del tema
  • Cómo cambiar el estilo de pestaña en Android?
  • Color del selector de lista de Android 4.4 Kit Kat
  • app: el tema ahora está obsoleto
  • ¿Por qué mi aplicación de Android no muestra el icono y el texto en ActionBar?
  • El ajuste textColor de un tema falla sólo en HTC Desire HD
  • ¿Cómo agregar atributos de varios temas a la misma actividad en el manifiesto de Android?
  • Cambiar el color de la barra de estado al ingresar al modo de acción contextual
  • AppCompat ActionBar tema giratorio desplegable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.