Un exemple d'utilisation:
Le Spinner a un thème sombre, mais je veux que le menu déroulant soit sur le thème de la lumière.
Un exemple d'utilisation:
Le Spinner a un thème sombre, mais je veux que le menu déroulant soit sur le thème de la lumière.
Réponses:
Android M
Nouveauté d'Android 6.0, Spinner dispose désormais du android:popupTheme
paramètre qui vous permet de définir le thème utilisé pour le popup (menu déroulant).
Vous pouvez l'utiliser comme ceci:
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:popupTheme="@android:style/ThemeOverlay.Material.Light" />
Cela fonctionnera sur les appareils exécutant le niveau d'API 23+, mais pas sur les appareils exécutant une version inférieure d'Android.
AppCompat
C'est là qu'AppCompat entre en jeu. Son implémentation Spinner prend également en charge popupTheme
, mais il est un peu plus compliqué de bien faire.
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Après cela, vous devez mettre à jour votre adaptateur pour pouvoir travailler avec AppCompat. Vous faites cela en lui faisant implémenter la nouvelle ThemedSpinnerAdapter
interface.
public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
Theme getDropDownViewTheme() { ... }
void setDropDownViewTheme(Theme theme) { ... }
}
Ces méthodes sont utilisées par Spinner pour pouvoir indiquer à l'adaptateur quel thème utiliser pour gonfler les vues déroulantes. Pour rendre cela aussi simple que possible, nous vous avons donné une Helper
classe que vous pouvez brancher sur votre adaptateur.
Cela signifie que votre adaptateur devient quelque chose comme:
public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
private final ThemedSpinnerAdapter.Helper mDropDownHelper;
public MyAdapter(Context context) {
mDropDownHelper = new ThemedSpinnerAdapter.Helper(context);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
// Inflate the drop down using the helper's LayoutInflater
LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater();
view = inflater.inflate(R.layout.my_dropdown, parent, false);
}
// ...
return view;
}
@Override
public void setDropDownViewTheme(Theme theme) {
mDropDownHelper.setDropDownViewTheme(theme);
}
@Override
public Theme getDropDownViewTheme() {
return mDropDownHelper.getDropDownViewTheme();
}
}
pour la flèche de spinner que j'ai utilisée, android:backgroundTint="@color/white"
cela fonctionnera à partir de l'API 21
pour la vue spinner et la vue déroulante:
ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);
areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);
pour getView () l'adaptateur utilisera spinner_item.xml
pour getDropDownView (), l'adaptateur utilisera dropdwon_item.xml
alors vous pouvez utiliser vos mises en page personnalisées comme vous le souhaitez
J'espère que ça aide
Juste pour référence si vous utilisez CursorAdapter
votre implémentation peut être beaucoup plus facile, il suffit de remplacer newView()
, pas besoin de remplacer getDropDownView()
ici:
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}
vous pouvez essayer ceci: dans votre dossier de mise en page, créez un spinner_item.xml:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:padding="10dp"
android:background = "#ffffff"
android:textColor="@color/primary_text"
android:textSize="@dimen/text_size_normal" />
puis utilisez ce code:
spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);