Je suis nouveau sur Android et j'essaie de définir un style pour toutes les cases à cocher de mon application. Mon style d'application est défini sur Theme.Holo, qui est sombre, et j'aimerais que les cases à cocher de ma liste soient de style Theme.Holo.Light. Je n'essaie pas de créer un style personnalisé. Le code ci-dessous ne semble pas fonctionner, rien ne se passe. Je dois le faire car la vue de ma liste a une texture de papier clair et le texte des cases à cocher et des cases à cocher est blanc, ce que je voudrais noir.
<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>
Aussi, pouvez-vous définir des styles pour des widgets individuels si vous définissez un style pour l'application?
Remarque: Utilisation de la bibliothèque de support Android v22.1.0 et de l'API de ciblage de niveau 11 ou supérieur? Faites défiler jusqu'à la dernière mise à jour.
Mon style d'application est défini sur Theme.Holo, qui est sombre et que je voudrais comme les cases à cocher de ma liste, le style Theme.Holo.Light . Je n'essaie pas de créer un style personnalisé. Le code ci-dessous ne semble pas pour travailler, rien ne se passe du tout.
Au début, on ne voit peut-être pas pourquoi le système présente ce comportement, mais lorsque vous examinez réellement les mécanismes, vous pouvez facilement le déduire. Laissez-moi vous guider pas à pas.
Voyons d’abord ce que le style Widget.Holo.Light.CompoundButton.CheckBox
définit. Pour clarifier les choses, j'ai également ajouté la définition du style «normal» (non léger).
<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
Comme vous pouvez le constater, les deux déclarations sont vides et enveloppent simplement Widget.CompoundButton.CheckBox
sous un nom différent. Alors regardons ce style de parent.
<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>
Ce style fait référence à la fois à un fond et à un bouton pouvant être dessinés. btn_check_label_background
est simplement un 9-patch et donc pas très intéressant à ce sujet. Cependant, ?android:attr/listChoiceIndicatorMultiple
indique qu'un attribut basé sur le thème actuel (il est important de le savoir) déterminera l'apparence réelle de la CheckBox
.
Comme listChoiceIndicatorMultiple
est un attribut de thème, vous en trouverez plusieurs déclarations - une pour chaque thème (ou aucune si elle est héritée d’un thème parent). Cela ressemblera à ceci (avec d'autres attributs omis pour plus de clarté):
<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>
Donc, c'est là que la vraie magie opère: en fonction de l'attribut listChoiceIndicatorMultiple
du thème, l'apparence réelle de CheckBox
est déterminée. Le phénomène que vous observez s’explique facilement: puisque l’apparence est basée sur un thème (et sur un style not, car il s’agit simplement d’une définition vide) et que vous héritez de Theme.Holo
, vous obtiendrez toujours le CheckBox
apparence correspondant au thème.
Désormais, si vous souhaitez modifier l'apparence de votre CheckBox
en version Holo.Light, vous devez en créer une copie, l'ajouter à vos ressources locales et utiliser un style personnalisé pour l'appliquer.
Quant à votre deuxième question:
Aussi, pouvez-vous définir des styles pour des widgets individuels si vous définissez un style pour l'application?
Absolument, et ils remplaceront tous les styles d’activité ou d’application.
Est-il possible de définir un thème (style avec images) sur la case à cocher widget. (...) Est-il possible d'utiliser ce sélecteur: link ?
Mettre à jour:
Permettez-moi de répéter en affirmant que vous n'êtes pas censé compter sur les ressources internes d'Android. Il y a une raison pour laquelle vous ne pouvez pas simplement accéder à l'espace de noms interne comme bon vous semble.
Cependant, une solution pour accéder aux ressources du système consiste à rechercher un identifiant par nom. Considérez l'extrait de code suivant:
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "Android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);
La première ligne renverra en réalité l'id de la ressource pouvant être extraite btn_check_holo_light
. Comme nous avions établi précédemment qu'il s'agissait du sélecteur de bouton qui détermine l'aspect de la variable CheckBox
, nous pouvons le définir comme "bouton pouvant être dessiné" sur le widget. Le résultat est une CheckBox
avec l'apparence de la version Holo.Light
, quel que soit le thème/style que vous définissez dans l'application, l'activité ou le widget au format xml. Etant donné que cela définit uniquement le bouton pouvant être dessiné, vous devrez modifier manuellement les autres styles. par exemple. en ce qui concerne l'apparence du texte.
Ci-dessous une capture d'écran montrant le résultat. La case à cocher du haut utilise la méthode décrite ci-dessus (je règle manuellement la couleur du texte sur noir en xml), tandis que la seconde utilise le style par défaut Holo
basé sur un thème (c'est-à-dire non clair).
Update2:
Avec l'introduction de Support Library v22.1.0 , les choses sont devenues beaucoup plus simples! Une citation des notes de publication (mon emphase):
Lollipop a ajouté la possibilité d'écraser le thème au niveau de la vue en utilisant l'attribut XML
Android:theme
, ce qui est extrêmement utile pour des tâches telles que les barres d'actions sombres pour les activités peu éclairées. Maintenant, AppCompat vous permet d’utiliserAndroid:theme
pour les barres d’outils (désapprouvant leapp:theme
utilisé précédemment) et, encore mieux, apporte la prise en charge deAndroid:theme
à toutes les vues des périphériques API 11+.
En d'autres termes: vous pouvez maintenant appliquer un thème sur une base de {vue par vue, ce qui facilite beaucoup la résolution du problème d'origine: il vous suffit de spécifier le thème que vous souhaitez appliquer pour la vue appropriée. C'est à dire. dans le contexte de la question initiale, comparez les résultats ci-dessous:
<CheckBox
...
Android:theme="@Android:style/Theme.Holo" />
<CheckBox
...
Android:theme="@Android:style/Theme.Holo.Light" />
La première CheckBox
est stylée comme si elle était utilisée dans un thème sombre, la seconde comme dans un thème clair, quel que soit le thème défini pour votre activité ou votre application.
Bien sûr, vous ne devriez plus utiliser le thème Holo, mais utiliser Matériau.
Peut-être que cela va vous satisfaire -
quelque chose.xml
<CheckBox
Android:text="Custom CheckBox"
Android:button="@drawable/checkbox_selector"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
Sélecteur
<?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>
Pour, la référence vient de se référer ici
La manière correcte de le faire pour la conception de matériau est la suivante:
Style:
<style name="MyCheckBox" parent="Theme.AppCompat.Light">
<item name="colorControlNormal">@color/foo</item>
<item name="colorControlActivated">@color/bar</item>
</style>
Disposition :
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:checked="true"
Android:text="Check Box"
Android:theme="@style/MyCheckBox"/>
Il préservera les animations Material sur Lollipop +.
Peut-être que vous voulez quelque chose comme:
<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>
Remarque, l'élément textColor.
Dans la réponse précédente également dans la section <selector>...</selector>
, vous aurez peut-être besoin de:
<item Android:state_pressed="true" Android:drawable="@drawable/checkbox_pressed" ></item>