studio - Estilo de casilla de verificación de Android
radio button style android (5)
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>
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.
<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?
La forma correcta de hacerlo para el diseño de 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 de materiales en Lollipop +.
Tal vez esto te satisfaga -
algo.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 solo se refiere here
Tal vez quieras 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 que el elemento textColor.
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).
<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 Widget.CompoundButton.CheckBox
con 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 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):
<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 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 casilla de verificación. (...) ¿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 casilla de verificación 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).
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 usarandroid:theme
para las Barras de herramientas (desaprobando laapp:theme
usado anteriormente) y, aún mejor, trae compatibilidad conandroid: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:
<CheckBox
...
android:theme="@android:style/Theme.Holo" />
<CheckBox
...
android:theme="@android:style/Theme.Holo.Light" />
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.