web-dev-qa-db-fra.com

Style de case à cocher Android

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?

39
user1330739

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).

Screenshot showing the result


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’utiliser Android:theme pour les barres d’outils (désapprouvant le app:theme utilisé précédemment) et, encore mieux, apporte la prise en charge de Android: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.

116
MH.

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

56
Praveenkumar

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 +.

21
Rémy DAVID

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.

4
Edwin Evans

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>
0
Alex Che