2012-04-13 40 views
35

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 casilla de verificación y el texto de la casilla de verificación son blancos, lo que me gustaría que fuera oscuro.Estilo de casilla de verificación de Android

<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 para widgets individuales si establece un estilo para la aplicación?

Respuesta

52

Tal vez esto va a satisfacer -

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 sólo se refiere here

0

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

<item android:state_pressed="true" android:drawable="@drawable/checkbox_pressed" ></item> 
108

Nota: El uso de la biblioteca de compatibilidad Android v22.1.0 y la orientación nivel de la API y hasta 11? Desplácese hacia abajo hasta la última actualización.


Mi estilo de aplicación se establece en Theme.Holo que es oscuro y me como las casillas de verificación en mi lista fin de ser de Theme.Holo.Light estilo. No estoy tratando de crear un estilo personalizado. El código siguiente no parece funcionar en , nada sucede en absoluto.

Al principio puede que no sea evidente por qué el sistema presenta este comportamiento, pero cuando se observa la mecánica se puede deducir 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).

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

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

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

<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 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 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 este donde la verdadera magia sucede: se basa en el atributo del tema listChoiceIndicatorMultiple, se determina la apariencia real de la CheckBox. El fenómeno que está viendo ahora se explica fácilmente: dado que la apariencia está basada en temas (y no está basado en el estilo, porque eso es simplemente una definición vacía) y hereda de Theme.Holo, siempre obtendrá la apariencia CheckBox coincidiendo con el tema

Ahora, si desea cambiar el aspecto de su CheckBox a la versión Holo.Light, tendrá que 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 podemos establecer estilos a los widgets individuales si se establece un estilo a la aplicación?

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

¿Hay alguna manera de establecer un tema (estilo con imágenes) en el widget casilla de verificación. (...) ¿Hay alguna forma de utilizar este selector: link?


Actualización:

Empezaré con decir una vez más que no se supone que depender 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 identificación 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 el ID de recurso del recurso dibujable btn_check_holo_light. Como establecimos anteriormente que este es el selector de botón que determina el aspecto del CheckBox, podemos establecerlo como "botón que se puede dibujar" en el widget. El resultado es 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; p.ej. 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 (configuré manualmente el color del texto en negro en xml), mientras que el segundo usa el estilo predeterminado basado en el tema Holo (no es luz, es decir).

Screenshot showing the result


Update2:

Con the introduction of Support Library v22.1.0, las cosas han vuelto mucho más fácil!Una cita de las notas de la versión (el subrayado es mío):

Lollipop añadido la posibilidad de sobrescribir el tema en una vista según el nivel de la vista mediante el atributo android:theme XML - increíblemente útil para cosas tales como barras de acción oscuras en actividades ligeras . Ahora, AppCompat le permite usar android:theme para las Barras de herramientas (desaprobando el app:theme utilizado anteriormente) y, incluso mejor, brinda soporte android:theme a todas las vistas en los dispositivos API 11+.

En otras palabras: ahora se puede aplicar un tema sobre una basepor visión, lo que hace que la solución del problema original mucho más fácil: basta con especificar el tema que desea aplicar para la vista relevante . Es decir. en el contexto de la pregunta original, comparar los resultados de abajo:

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

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

La primera CheckBox se labra como si se utiliza en un tema oscuro, la segunda como en un tema de la luz, sin tener en cuenta el tema actual fijado a su actividad o aplicación.

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

+0

Gracias por tomarse el tiempo para responder. Veo el problema aquí y todavía me pregunto si esto se puede hacer sin tener que hacer un montón de trabajo. ¿Hay alguna manera de establecer un tema (estilo con imágenes) para el widget de casilla de verificación. Sé que puedo encontrar las imágenes e incluirlas en mi proyecto, pero parece que se ha acabado. ¿Hay alguna forma de utilizar este selector ?: https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_check_holo_light.xml – user1330739

+2

@ user1330739: Sí y no. Se supone que no debe confiar en los recursos internos, ya que Google puede decidir cambiarlos en futuras versiones. Incluir una copia de los recursos extraíbles en sus recursos locales es realmente su mejor opción. Dicho esto, hay otra solución (fea) que conozco, pero que solo funciona en tiempo de ejecución (lo que significa que no puedes hacer referencia a ella en tus archivos xml). Por favor, mira la edición de mi respuesta anterior. –

+0

@MH. bien hecho. –

4

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> 

Nota, el elemento textColor.

14

La forma correcta de hacerlo para el diseño de materiales 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"/> 

preservará animaciones material sobre Lollipop +.

Cuestiones relacionadas