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?
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.
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) {
}
};
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>
voici un lien qui peut vous aider à changer la couleur du fileur :
<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.
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 .
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);
}
});
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.
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);
pour ceux qui veulent changer DrowDownIcon
couleur
vous pouvez utiliser comme ceci
spinner.getBackground().setColorFilter(Color.parseColor("#ffffff"), PorterDuff.Mode.SRC_ATOP);
Pour quelqu'un qui a seulement besoin de Style
AppCompat
.
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()
le plus simple: fonctionne pour moi
TextView spinnerText = (TextView) spinner.getChildAt(0);
spinnerText.setTextColor(Color.RED);
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);
<?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);
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.
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>
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;
}
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" />
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);}
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();
}