Donc, je veux appliquer une teinte à la case à cocher AppCompat.
Tout fonctionne bien sur Lollipop:
Android:buttonTint="@color/purple_FF4081"
ou de cette façon:
Android:theme="@style/Theme.MyTheme.PurpleAccent"
Mais la définition de l'un de ces paramètres ne change rien sur pré-Lollipop. Fonctionne uniquement si j'ai défini colorAccent
pour le thème de l'application. Mais je ne veux pas que tous les widgets changent de look, juste une case à cocher. Existe-t-il un moyen de le faire sans définir de dessinables de couleur?
Fyi rapide que tout cela a changé maintenant après l'introduction de AppCompatActivity et des nouvelles bibliothèques de support, pour référence (très bien décrit ici) une case à cocher peut être teintée en utilisant l'attribut theme
et définition de colorControlNormal
et colorControlActivated
:
styles.xml
<style name="MyCheckBox" parent="Theme.AppCompat.Light">
<item name="colorControlNormal">@color/Indigo</item>
<item name="colorControlActivated">@color/pink</item>
</style>
mise en page xml:
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:checked="true"
Android:text="Check Box"
Android:theme="@style/MyCheckBox"/>
Vous pouvez colorer directement dans le xml. Utilisez buttonTint pour la boîte: (à partir du niveau API 23)
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:buttonTint="@color/CHECK_COLOR" />
Vous pouvez également le faire en utilisant appCompatCheckbox v7 pour les anciennes API:
<Android.support.v7.widget.AppCompatCheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:buttonTint="@color/COLOR_HERE" />
J'avais besoin de le faire par programme, après avoir creusé un peu, j'ai finalement trouvé cette solution (testée sur KitKat & Marshmallow), je vais juste la poster au cas où cela aiderait quelqu'un:
public static void setAppCompatCheckBoxColors(final AppCompatCheckBox _checkbox, final int _uncheckedColor, final int _checkedColor) {
int[][] states = new int[][]{new int[]{-Android.R.attr.state_checked}, new int[]{Android.R.attr.state_checked}};
int[] colors = new int[]{_uncheckedColor, _checkedColor};
_checkbox.setSupportButtonTintList(new ColorStateList(states, colors));
}
J'ai essayé toutes les réponses mais seule celle-ci fonctionne pour moi, ajoutez l'attribut colorControlNormal
et colorControlActivated
au style de base de toute l'activité (ou application) supprimez le thème de votre contrôleur
voici un exemple
<style name="AppTheme" parent="AppTheme.Base"/>
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/colorPrimary</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<!-- colorAccent is used as the default value for colorControlActivated,
which is used to tint widgets -->
<item name="colorAccent">@color/colorAccent</item>
<!-- to hide white screen in start of window -->
<item name="Android:windowIsTranslucent">true</item>
<item name="colorControlNormal">@color/orange_two</item>
<item name="colorControlActivated">@color/pumpkin_orange</item>
</style>
Votre Mainfest
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:supportsRtl="true"
Android:theme="@style/AppTheme"> // here is the style used
<activity Android:name=".MainActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
EDIT 6/28/16: La réponse ci-dessous n'est plus correcte. Voir la réponse acceptée sur la nouvelle façon dont Google a autorisé la teinture sur les appareils pré-v21 avec la bibliothèque compatible avec les applications.
Réponse originale:
La réponse courte est non. Les dessinables personnalisés devront être créés pour être utilisés sur les appareils antérieurs à la version 21. En effet, les widgets spéciaux sensibles à la teinte sont actuellement masqués, car ils constituent un détail d'implémentation inachevé pour le moment (ce que Google indique que cela pourrait changer à l'avenir, selon leur blog de développeur dans le FAQ section)
Il existe deux scénarios que vous pouvez remplacer le colorAccent qui peuvent fonctionner: