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?
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.
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 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>
Voici un lien qui peut vous aider à changer la couleur du Spinner:
<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.
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 .
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.
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);
}
});
Pour quelqu'un qui n'a besoin que de Style
manière pour AppCompat
.
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()
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);
Pour ceux qui veulent changer DrowDownIcon
couleurvous pouvez utiliser comme ceci
spinner.getBackground().setColorFilter(Color.parseColor("#ffffff"), PorterDuff.Mode.SRC_ATOP);
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);
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;
}
}
Le plus simple: ça marche pour moi
TextView spinnerText = (TextView) spinner.getChildAt(0);
spinnerText.setTextColor(Color.RED);
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>
<?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);
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.
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" />
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);}
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" />
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>
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;
}