web-dev-qa-db-fra.com

Changer la couleur du petit triangle sur spinner dans android

enter image description here

Comment puis-je changer la couleur du petit triangle dans le coin en bas à droite de la roulette, comme indiqué sur l'image? Il montre la couleur grise par défaut en ce moment. comme ça

enter image description here

49
Yawar

Pour obtenir les images correctes, vous pouvez aller sur le site Android Asset Studio et choisir ensuite le Android Holo Colors Generator . Cela créera tous les actifs dont vous pourriez avoir besoin, y compris le "triangle". Il génère également les fichiers XML qui implémentent les modifications.


Voici les exemples de fichiers XML:

Couleur personnalisée:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="apptheme_color">#33b5e5</color>
</resources>

Style de spinner personnalisé:

<?xml version="1.0" encoding="utf-8"?>

<!-- Generated with http://Android-holo-colors.com -->
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">

  <style name="SpinnerAppTheme" parent="Android:Widget.Spinner">
      <item name="Android:background">@drawable/apptheme_spinner_background_holo_light</item>
      <item name="Android:dropDownSelector">@drawable/apptheme_list_selector_holo_light</item>
  </style>

  <style name="SpinnerDropDownItemAppTheme" parent="Android:Widget.DropDownItem.Spinner">
      <item name="Android:checkMark">@drawable/apptheme_btn_radio_holo_light</item>
  </style>
</resources>

Thème d'application personnalisé:

<?xml version="1.0" encoding="utf-8"?>

<!-- Generated with http://Android-holo-colors.com -->
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">

  <style name="AppTheme" parent="@style/_AppTheme"/>

  <style name="_AppTheme" parent="Theme.AppCompat.Light">

    <item name="Android:spinnerStyle">@style/SpinnerAppTheme</item>

    <item name="Android:spinnerDropDownItemStyle">@style/SpinnerDropDownItemAppTheme</item>

  </style>

</resources>

Comme vous pouvez le constater, de nombreux tirages sont référencés par ces styles.

Voici celui spécifique au "triangle" que vous voulez changer:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.Apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_enabled="false"
          Android:drawable="@drawable/apptheme_spinner_disabled_holo_light" />
    <item Android:state_pressed="true"
          Android:drawable="@drawable/apptheme_spinner_pressed_holo_light" />
    <item Android:state_pressed="false" Android:state_focused="true"
          Android:drawable="@drawable/apptheme_spinner_focused_holo_light" />
    <item Android:drawable="@drawable/apptheme_spinner_default_holo_light" />
</selector>

Je ne pense pas que ce soit le bon endroit pour répertorier tous les fichiers de manière complète, car vous pouvez tous les obtenir directement à partir de l'outil référencé.


Remarque: vous permet de thématiser l'ensemble de votre application afin que tous les filateurs soient mis à jour dans le style personnalisé.

Si vous cherchez un moyen rapide et sale de changer une seule spinner, consultez cet article référencé par Ricky dans son commentaire:

Je recommande quand même de le lire car il explique très bien le processus et vous aidera à comprendre le reste de ma réponse.

18
Richard Le Mesurier

La solution la meilleure et la plus simple:

spinner.getBackground().setColorFilter(getResources().getColor(R.color.red), PorterDuff.Mode.SRC_ATOP);

Autre solution (merci à Simon) si vous ne voulez pas changer tous les Spinners:

Drawable spinnerDrawable = spinner.getBackground().getConstantState().newDrawable();

spinnerDrawable.setColorFilter(getResources().getColor(R.color.red), PorterDuff.Mode.SRC_ATOP);

if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    spinner.setBackground(spinnerDrawable);
}else{
    spinner.setBackgroundDrawable(spinnerDrawable);
}
80
toni

À partir de Lollipop , vous pouvez définir la teinte de fond sur xml,

Android:backgroundTint="@color/my_color"
37
Luis

Je suis encore très nouveau sur le développement de Android, alors prenez peut-être mon conseil avec un grain de sel, mais aucune des réponses ici ne semble se rapporter à la mise en œuvre de spinner que j'utilisais.

Ce que je cherchais

Android:backgroundTint="@color/colorPrimary"

Voici l'intégralité de la balise <Spinner>:

        <Spinner
            Android:id="@+id/coin_selector"
            Android:layout_width="wrap_content"
            Android:layout_height="21dp"
            Android:layout_margin="26dp"
            Android:layout_weight="1"
            Android:textColor="#FFFFFF"
            Android:dropDownSelector="@color/colorAccent"
            Android:backgroundTint="@color/colorPrimary"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            tools:layout_editor_absoluteY="89dp"/>

Blue triangle

10
jessems

Juste faire comme ça. Cela vous aidera à résoudre votre problème.

<RelativeLayout 
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:background="spinner background image">

        <Spinner       
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"        
        Android:background="@null"/>

        <ImageView 
         Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentRight="true"
        Android:src="arrow image" />

    </RelativeLayout>

ou

Je viens de jeter un coup d'oeil sur la réponse que j'ai donnée pour une autre requête: Custom Spinner

5
RIJO RV

Si vous avez minSdkVersion 21, c'est très simple:

<Spinner
style="@style/Widget.AppCompat.DropDownItem.Spinner"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:backgroundTint="@color/triangleColor" />

où triangleColor est votre couleur.

4

Voici une autre façon de résoudre ce problème par programme également. (Testé sur API 19 et ci-dessus).

Utilisez ViewCompat pour cela.

ViewCompat.setBackgroundTintList(spinner, ColorStateList.valueOf(your_color));

L'utilisation de spinner.setSupportBackgroundTintList jette une erreur

4
sud007

La solution pour la version minimale du SDK 14. Vous pouvez utiliser AppCompatSpinner à partir de la bibliothèque de support:

AppCompatSpinner spinner = (AppCompatSpinner) view.findViewById(R.id.my_spinner);
spinner.setSupportBackgroundTintList(ContextCompat.getColorStateList(context, R.color.my_color));
3
vmayatskii