102 votes

Comment définir un thème différent pour un Spinner ' s dropdown ?

Un exemple d’utilisation :

enter image description here

Le cône d’hélice est sombre sur le thème, mais je veux la liste déroulante d’être clair sur le thème.

195voto

Chris Banes Points 3013

Android M

Nouveau dans Android 6.0, Spinner a maintenant l' android:popupTheme paramètre qui permet de définir le thème utilisé pour le menu (déroulant).

Vous pouvez l'utiliser de la manière suivante:

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:popupTheme="@android:style/ThemeOverlay.Material.Light" />

Qui fonctionne sur les appareils exécutant API de niveau 23+, mais pas sur les périphériques exécutant la version d'Android avant.

AppCompat

C'est là que AppCompat. C'est Spinner mise en œuvre prend également en charge popupTheme, mais c'est un peu plus compliqué pour obtenir le droit.

<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 Carte afin d'être en mesure de travailler avec AppCompat. Vous devez le faire en faisant mettre en œuvre le nouveau ThemedSpinnerAdapter interface.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Ces méthodes sont utilisées par Spinner pour être en mesure de dire à l'Adaptateur de thème à utiliser pour gonfler tous déroulant points de vue. De faire ce aussi facile que possible, nous vous avons donné un Helper classe, que vous pouvez brancher à votre carte.

Cela signifie que votre carte 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();
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X