Comment changer la taille et la couleur du texte de spinner?

dans mon application Android, j'utilise spinner, et j'ai chargé des données de la base de données SQLite dans le spinner, et ça fonctionne correctement. Voici le code pour que.

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 du texte 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?

346
demandé sur Peter Mortensen 2012-02-28 09:02:24

19 réponses

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

spinner_item.xml:

Donnez votre couleur personnalisée et la taille du texte dans 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"
    />

utilisez maintenant ce fichier pour afficher vos articles spinner comme:

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

vous n'avez pas besoin de définir la ressource drop down. Il vous faudra spinner_item.xml pour voir vos produits à spinner.

646
répondu Hiral 2015-11-26 23:56:03

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

    }
};
156
répondu Ashraf 2015-11-26 23:57:58

si tous les spinners peuvent avoir la même couleur de texte pour leurs éléments TextView, une autre approche est d'utiliser un style personnalisé pour les éléments spinner dropdown:

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>
122
répondu Whypee 2015-11-27 00:00:19

voici un lien qui peut vous aider à changer la couleur du fileur :

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 mise en page avec une définition personnalisée pour l'élément 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 voulez personnaliser les éléments de la liste déroulante, vous devez créer un nouveau fichier de mise en page. 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 du fileur:

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 ça.

59
répondu Niib Fouda 2017-04-07 14:00:58

pour éviter le retard, vous devez non seulement définir les propriétés du texte dans l'auditeur onItemSelected , mais aussi dans la méthode onCreate de L'activité (mais c'est un peu délicat).

spécifiquement, vous devez mettre ceci dans onCreate après avoir réglé l'adaptateur:

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

et 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
répondu Rock Lee 2017-05-23 12:18:24

si vous voulez que la couleur du texte change dans l'élément sélectionné seulement, alors cela peut être une solution possible. Ça a marché pour moi et ça devrait marcher pour toi aussi.

spinner.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ((TextView) spinner.getSelectedView()).setTextColor(Color.WHITE);
            }
        });
11
répondu vishal-wadhwa 2017-07-17 10:46:58

si vous travaillez avec android.soutien.v7.widget.AppCompatSpinner voici la solution éprouvée la plus simple en utilisant des 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 l'android:backgroundtin définit la couleur pour la flèche de descente et le fond de descente.

7
répondu voytez 2018-03-02 16:02:38

plutôt que de faire une mise en page personnalisée pour obtenir une petite taille et si vous voulez utiliser la mise en page interne petite taille D'Android pour le spinner, vous devez utiliser:

" androïde.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 voulez réduire la taille d'une liste déroulante utilisez ceci:

madaptor.setDropDownViewResource(android.R.layout.simple_gallery_item);
5
répondu Hemant Shori 2015-11-27 00:03:05

pour ceux qui veulent changer DrowDownIcon couleur vous pouvez utiliser comme ceci

spinner.getBackground().setColorFilter(Color.parseColor("#ffffff"), PorterDuff.Mode.SRC_ATOP);
3
répondu AMAN SINGH 2017-01-30 10:00:22

Pour quelqu'un qui a seulement besoin de Style AppCompat .

résultat

enter image description here enter image description here

les 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 programmatiquement avec un style défini.

Essayez ceci.

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, en utilisant le même Context avec le Spinner est la chose la plus importante.

spinner.getContext()
3
répondu wonsuc 2017-12-04 12:23:21

le plus simple: fonctionne pour moi

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

spinnerText.setTextColor(Color.RED);
2
répondu Waqar Ahmed Shujrah 2015-01-21 10:46:17

la façon la plus facile de réutiliser/changer l'android.R. disposition de ressources est de simplement aller de la définition. Dans Android Studio, faire Ctrl + B sur android.R. layout.simple_spinner_item.XML.

il vous mènera au fichier de ressources. Copiez simplement le fichier de ressources et ajoutez une nouvelle mise en page dans votre paquet.R. mettre en page le dossier et changer la couleur du texte de textview comme vous voulez et puis l'appeler dans l'adaptateur comme ceci:

ArrayAdapter<String> adapter = new ArrayAdapter<String(Context,R.layout.spinner_item, spinnerlist);
2
répondu ZygoteInit 2015-11-27 00:04:32
<?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"/>

il suffit d'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
répondu santosh 2015-05-07 21:52:47

tout d'abord, nous devons créer le simple xml fichier de ressources pour le 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 sauvez-le. après avoir réglé sur votre liste d'adaptateurs.

1
répondu Ishor Neupane 2016-11-25 08:05:51

une autre variante de la solution D'Ashraf serait de s'assurer que vous tenez compte des tailles d'écran. Vous aurez besoin d'obtenir le spinner dans onCreate et de mettre l'auditeur après que vous avez mis l'adaptateur:

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

vous pouvez alors commencer à changer la taille du texte de la vue qui s'affiche avant que le spinner ne soit cliqué:

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 ajouter 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
répondu whyoz 2014-01-27 21:20:21

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

utiliser getDropDownView() pour la broche ouverte.

@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 broche fermée.

@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
répondu Bhavinkumar Patel 2015-12-14 11:02:55

vous pouvez avoir ce type d'adaptateur pour broche, 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;
        }

while 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
répondu blackHawk 2018-01-19 07:26:44

pour changer la couleur du texte de spinner:

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            ((TextView) parent.getChildAt(0)).setTextColor(Color.WHITE);}
0
répondu Hanisha 2018-05-05 10:30:04

essayez cette méthode. Il est travaillé pour moi.

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    TextView textView = (TextView) view;
    ((TextView) adapterView.getChildAt(0)).setTextColor(Color.RED);
    ((TextView) adapterView.getChildAt(0)).setTextSize(20);
    Toast.makeText(this, textView.getText()+" Selected", Toast.LENGTH_SHORT).show();
}
-2
répondu Tushar Lathiya 2018-02-09 12:25:21