web-dev-qa-db-fra.com

Comment changer la taille et la couleur du texte Spinner?

Dans mon application Android, j'utilise spinner et j'ai chargé les données de la base de données SQLite dans spinner, et tout fonctionne correctement. Voici le code pour cela.

Spinner spinner = (Spinner) this.findViewById(R.id.spinner1);
List<String> list = new ArrayList<String>();
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>  (this,Android.R.layout.simple_spinner_item, list);
cursor.moveToFirst();

list.add("All Lists");

if (cursor.getCount() > 0) {
    for (int i = 0; i < cursor.getCount(); i++) {
        keyList[i] = cursor.getString(cursor.getColumnIndex(AndroidOpenDbHelper.KEYWORD));
        list.add(keyList[i]);
        cursor.moveToNext();
    }
}
Database.close();
cursor.close();
dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);

Maintenant, je veux changer la couleur et la taille du texte des données de spinner. J'ai utilisé les lignes XML suivantes pour ma balise spinner sur mon fichier XML, mais cela ne fonctionne pas.

Android:textColor="@Android:color/white"
Android:textSize="11dp"

Comment puis-je changer la couleur et la taille du texte de mon spinner?

371
Dinesh Anuruddha

Créez un fichier XML personnalisé pour votre élément spinner.

spinner_item.xml:

Donnez à votre couleur et à votre taille personnalisées le texte de ce fichier.

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

<TextView  
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content"
    Android:textSize="20sp"
    Android:gravity="left"  
    Android:textColor="#FF0000"         
    Android:padding="5dip"
    />

Maintenant, utilisez ce fichier pour afficher vos éléments de spinner comme:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item,list);

Vous n'avez pas besoin de définir la ressource déroulante. spinner_item.xml suffit pour afficher vos éléments dans spinner.

683
Hiral

Simple et croustillant ...:

private OnItemSelectedListener OnCatSpinnerCL = new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

       ((TextView) parent.getChildAt(0)).setTextColor(Color.BLUE);
       ((TextView) parent.getChildAt(0)).setTextSize(5);

    }

    public void onNothingSelected(AdapterView<?> parent) {

    }
};
165
Ashraf

Si tous les fileurs peuvent avoir la même couleur de texte pour leurs éléments TextView, une autre approche consiste à utiliser un style personnalisé pour les éléments déroulants à plat:

Dans res/values/styles.xml:

<resources>
    <style name="AppBaseTheme" parent="Android:Theme.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="Android:spinnerDropDownItemStyle">@style/mySpinnerItemStyle</item>
    </style>

    <style name="mySpinnerItemStyle" parent="@Android:style/Widget.Holo.DropDownItem.Spinner">
        <item name="Android:textColor">@color/my_spinner_text_color</item>
    </style>
</resources>

Et définissez votre couleur personnalisée dans res/values ​​/ colors.xml:

<color name="my_spinner_text_color">#808080</color>
140
Whypee

Voici un lien qui peut vous aider à changer la couleur du Spinner:

Cliquez ici

<Spinner
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/spinner"
    Android:textSize="20sp"
    Android:entries="@array/planets"/>

Vous devez créer votre propre fichier de présentation avec une définition personnalisée pour l'élément spinner spinner_item.xml:

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textSize="20sp"
    Android:textColor="#ff0000" />

Si vous souhaitez personnaliser les éléments de la liste déroulante, vous devez créer un nouveau fichier de présentation. spinner_dropdown_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    Android:maxLines="1"
    Android:layout_width="match_parent"
    Android:layout_height="?android:attr/listPreferredItemHeight"
    Android:ellipsize="Marquee"
    Android:textColor="#aa66cc"/>

Et enfin un autre changement dans la déclaration de la fileuse:

ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
R.array.planets_array, R.layout.spinner_item);

adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(adapter);

C'est tout.

65
Niib Fouda

Pour éviter les retards, vous devez non seulement définir les propriétés du texte dans le programme d'écoute onItemSelected, mais également dans la méthode onCreate de Activity (mais c'est un peu compliqué).

Spécifiquement, vous devez mettre ceci dans onCreate après avoir configuré l'adaptateur:

spinner.setSelection(0, true);
View v = spinner.getSelectedView();
((TextView)v).setTextColor(backgroundColor);

Et puis mettez ceci dans onItemSelected:

((TextView) view).setTextColor(backgroundColor);

Voici un exemple complet:

@Override  
protected void onCreate(Bundle savedInstanceState)
{  
    Spinner spinner = (Spinner) findViewById(R.id.spinner); 

    //Set the choices on the spinner by setting the adapter.  
    spinner.setAdapter(new SpinnerAdapter(toolbar.getContext(), new String[]{"Overview", "Story", "Specifications", "Poll", "Video"}, accentColor, backgroundColor));

    //Set the text color of the Spinner's selected view (not a drop down list view) 
    spinner.setSelection(0, true);
    View v = spinner.getSelectedView();
    ((TextView)v).setTextColor(backgroundColor);

    //Set the listener for when each option is clicked.  
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {  

        @Override  
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
        {  
           //Change the selected item's text color  
           ((TextView) view).setTextColor(backgroundColor);
        }  

        @Override  
        public void onNothingSelected(AdapterView<?> parent)
        {  
        }  
    });  

}  

Pour plus de détails, voir ma question .

15
Rock Lee

Si vous travaillez avec Android.support.v7.widget.AppCompatSpinner, voici la solution la plus simple testée à l'aide de styles:

 <Android.support.v7.widget.AppCompatSpinner
                    Android:id="@+id/spefcialFx"
                    style="@style/Widget.AppCompat.Spinner.Underlined"
                    Android:layout_width="200dp"
                    Android:layout_height="wrap_content"
                    Android:layout_marginLeft="4dp"
                    Android:theme="@style/Spinner"
                    Android:entries="@array/special_fx_arrays"
                    Android:textSize="@dimen/text_size_normal"></Android.support.v7.widget.AppCompatSpinner>

Et le style:

<style name="Spinner" parent="Widget.AppCompat.Light.DropDownItem.Spinner">
        <item name="Android:paddingStart">0dp</item>
        <item name="Android:paddingEnd">0dp</item>
        <item name="Android:textColor">@color/white</item>
        <item name="Android:backgroundTint">@color/red</item>
        <item name="Android:textSize">14sp</item>
    </style>

Le seul inconvénient est Android: backgroundTint définit la couleur à la fois pour la flèche déroulante et l’arrière-plan déroulant.

14
voytez

Si vous souhaitez que la couleur du texte ne change que dans l'élément sélectionné, il peut s'agir d'une solution de contournement possible. Cela a fonctionné pour moi et devrait fonctionner pour vous aussi.

spinner.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ((TextView) spinner.getSelectedView()).setTextColor(Color.WHITE);
            }
        });
12
vishal-wadhwa

Pour quelqu'un qui n'a besoin que de Style manière pour AppCompat.

Résultat
 enter image description here  enter image description here

styles.xml 

<resources>
    ... 
    <style name="Spinner" parent="Widget.AppCompat.Light.DropDownItem.Spinner">
        <item name="Android:paddingStart">0dp</item>
        <item name="Android:paddingEnd">0dp</item>
        <item name="Android:textColor">@color/material_grey_700</item>
        <item name="Android:textSize">12sp</item>
    </style>
</resources>

your_spinner_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />
    ...

    <Android.support.v7.widget.AppCompatSpinner
        Android:id="@+id/content_spinner"
        style="@style/Widget.AppCompat.Spinner.Underlined"
        Android:layout_width="140dp"
        Android:layout_height="wrap_content"
        Android:entries="@array/shipping_tracking_carrier_names"
        Android:spinnerMode="dropdown"
        Android:theme="@style/Spinner" />

    <EditText
        Android:id="@+id/content_input"
        Android:layout_width="140dp"
        Android:layout_height="wrap_content"
        Android:inputType="text"
        Android:maxLines="1"
        Android:paddingEnd="8dp"
        Android:paddingStart="8dp"
        Android:textColor="@color/material_grey_700"
        Android:textSize="12sp" />

    ...
</LinearLayout>    

Plus
Et si vous voulez définir Android:entries par programme avec un style défini.
Essaye ça. 

AppCompatSpinner spinner = findViewById(R.id.content_spinner);
CharSequence[] entries = getResources().getTextArray(R.array.shipping_tracking_carrier_names);
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<>(spinner.getContext(), Android.R.layout.simple_spinner_item, entries);
adapter.setDropDownViewResource(Android.support.v7.appcompat.R.layout.support_simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Comme dans le code, utiliser Context avec Spinner est la chose la plus importante. 

spinner.getContext()
4
wonsuc

Plutôt que de créer une mise en page personnalisée pour obtenir une petite taille et si vous souhaitez utiliser LAYOUT interne de petite taille d'Android pour le disque, vous devez utiliser:

"Android.R.layout.simple_gallery_item" au lieu de "Android.R.layout.simple_spinner_item".

ArrayAdapter<CharSequence> madaptor = ArrayAdapter
            .createFromResource(rootView.getContext(),
                                R.array.String_visitor,
                                Android.R.layout.simple_gallery_item);

Il peut réduire la taille de la disposition de spinner. C'est juste un truc simple.

Si vous souhaitez réduire la taille d'une liste déroulante, utilisez ceci:

madaptor.setDropDownViewResource(Android.R.layout.simple_gallery_item);
4
Hemant Shori

Pour ceux qui veulent changer DrowDownIcon couleurvous pouvez utiliser comme ceci

spinner.getBackground().setColorFilter(Color.parseColor("#ffffff"), PorterDuff.Mode.SRC_ATOP);
3
AMAN SINGH

Le moyen le plus simple de réutiliser/modifier les ressources Android.R.layout est tout simplement la définition. Dans Android Studio, faites Ctrl + B sur Android.R.layout.simple_spinner_item.xml.

Cela vous mènera au fichier de ressources. Copiez simplement le fichier de ressources et ajoutez une nouvelle mise en page dans votre dossier Package.R.layout, modifiez la couleur du texte de textview à votre guise, puis appelez-le simplement avec l’adaptateur de la manière suivante:

ArrayAdapter<String> adapter = new ArrayAdapter<String(Context,R.layout.spinner_item, spinnerlist);
2
ZygoteInit

Peut changer la couleur du texte en remplaçant la méthode getView comme suit:

 new ArrayAdapter<String>(getContext(), Android.R.layout.simple_spinner_dropdown_item, list()){
                @Override
                public View getView(int position, View convertView, @NonNull ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    //change the color to which ever you want                    
                    ((CheckedTextView) view).setTextColor(Color.RED);
                    //change the size to which ever you want                    
                    ((CheckedTextView) view).setTextSize(5);
                    //for using sp values use setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
                    return view;
                }
    }
2
Madhur

Le plus simple: ça marche pour moi

TextView spinnerText = (TextView) spinner.getChildAt(0);

spinnerText.setTextColor(Color.RED);
2
Waqar Ahmed Shujrah

Si vous voulez une méthode simple, pour ajouter des éléments à une liste déroulante, vous les ajoutez généralement à strings.xml. Voici un exemple sur la façon d'ajouter de la couleur à l'aide du fichier strings.xml:

SÉLECTIONNER LA GAMME D'ÂGE

<string-array name="age_array">

   <item> 0-6 </item>                               //No custom colour

  <item><font fgcolor='#FF4CD964'> 12+ </font></item> //With custom colour

</string-array>
1
Gamer Gunshield
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:id="@Android:id/text1"
    style="?android:attr/spinnerItemStyle"
    Android:singleLine="true"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textColor="#fff"
    Android:ellipsize="Marquee"
    Android:textAlignment="inherit"/>

juste utiliser ceci:

ArrayAdapter<String> adapter_category = new ArrayAdapter<String>(this,
    R.layout.spinner_list_item, categories);
adapter_category
    .setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
1
santosh

Nous devons d’abord créer le fichier de ressources xml simple pour textview comme ci-dessous: 

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

 <TextView  
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content"
    Android:textSize="20sp"
    Android:gravity="left"  
    Android:textColor="#FF0000"         
    Android:padding="5dip"
    />   

et enregistrez-le. après avoir défini sur votre adaptateur.

1
Ishor Neupane

ajoutez juste un nouveau style comme ceci:

<style name="mySpinnerItemStyle" parent="ThemeOverlay.AppCompat.Dark">
    <item name="Android:textColor">#000</item>
    <item name="Android:color">#000</item>
</style>

et l'utiliser:

<Spinner
      Android:id="@+id/spinnerCategories"
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"
      style="@style/mySpinnerItemStyle"
      Android:layout_margin="5dp" />
0
Elyas Nategh

Pour changer la couleur du texte en rotation:

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            ((TextView) parent.getChildAt(0)).setTextColor(Color.WHITE);}
0
Hanisha

vous pouvez avoir ce type d'adaptateur pour spinner, totalement personnalisé:

 ArrayAdapter<String> genderAdapter = new ArrayAdapter<String>(getActivity(), R.layout.spinner_text, genderList) {

        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);
            ((TextView) v).setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
            ((TextView) v).setTextColor(Color.parseColor("#676767"));
            ((TextView) v).setTypeface(vrFont);
            return v;
        }

        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            View v = super.getDropDownView(position, convertView, parent);
            ((TextView) v).setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
            ((TextView) v).setTypeface(vrFont);
            ((TextView) v).setTextColor(Color.parseColor("#676767"));

            if (position == 0) {
                ((TextView) v).setTextColor(Color.parseColor("#979797"));
            }

            return v;
        }

tandis que R.layout.spinner_text est:

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/text1"
style="?android:attr/spinnerItemStyle"
Android:layout_width="fill_parent"
Android:layout_height="40dp"
Android:gravity="center_vertical|left"
Android:ellipsize="Marquee"
Android:maxLines="1"
Android:textColor="@color/whiteThree" />
0
blackHawk

Une autre variante de la solution d’Achraf serait de vous assurer que vous tenez compte de la taille de l’écran. Vous aurez besoin d'obtenir le spinner dans onCreate et de définir le programme d'écoute après avoir défini l'adaptateur:

//set your adapter with default or custom spinner cell, then://
serverSpinner.setOnItemSelectedListener(spinnerSelector);
serverSpinner.setSelection(defaultServer);

Ensuite, vous pouvez commencer à changer la taille du texte de la vue affichée avant que vous ne cliquiez sur la roulette:

private AdapterView.OnItemSelectedListener spinnerSelector = new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
        boolean largeTablet = getResources().getBoolean(R.bool.isLargeTablet);
        if (tabletSize) { ((TextView)parent.getChildAt(0)).setTextSize(16); }
        else if (largeTablet) { ((TextView)parent.getChildAt(0)).setTextSize(18); }
        else { ((TextView)parent.getChildAt(0)).setTextSize(12); }
    }
    public void onNothingSelected(AdapterView<?> parent) {

    }
};

Tout ce que vous avez à faire est de créer des dossiers spécifiques à la mise en page comme ceci:

valeurs-sw360dp

valeurs-sw600dp

valeurs-sw800dp

puis ajoutez un fichier xml nommé "bool.xml" dans chacun de ces dossiers:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isTablet">false</bool>
    <bool name="isLargeTablet">false</bool>
</resources>
0
whyoz

J'ai fait ceci comme suit. J'ai utilisé les méthodes getDropDownView () et getView ().

Utilisez getDropDownView() pour Spinner ouvert.

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
  View view = convertView;
  if (view == null) {
    LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = vi.inflate(R.layout.context_row_icon, null);
  }
  TextView mTitle = (TextView) view.findViewById(R.id.context_label);
  ImageView flag = (ImageView) view.findViewById(R.id.context_icon);                

  mTitle.setText(values[position].getLabel(activity));

  if (!((LabelItem) getItem(position)).isEnabled()) {
    mTitle.setTextColor(activity.getResources().getColor(R.color.context_item_disabled));
  } else {
    mTitle.setTextColor(activity.getResources().getColor(R.color.context_item));
  }
  return view;
}

Et utilisez getView() pour Spinner fermé.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view = convertView;
  if (view == null) {
    LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = vi.inflate(R.layout.context_row_icon, null);
  }
  TextView mTitle = (TextView) view.findViewById(R.id.context_label);
  ImageView flag = (ImageView) view.findViewById(R.id.context_icon);

  mTitle.setText(values[position].getLabel(activity));
  mTitle.setTextColor(activity.getResources().getColor(R.color.context_item_disabled));

  return view;
}
0
Bhavinkumar Patel