web-dev-qa-db-fra.com

Case à cocher teint sur pré v21

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?

22
bluebyte

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"/>
62
Daniel Wilson

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" />
25
Anudeep Samaiya

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));
}
11
androidseb

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>
2
Mina Fawzy

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:

  • Avoir votre propre version personnalisée du widget (c'est-à-dire que vous avez étendu EditText)
  • Création du EditText sans LayoutInflater (c'est-à-dire appel du nouveau EditText ()).
1
opt05