Come si imposta un tema diverso per il menu a discesa di uno Spinner?


Risposte:


195

Android M

Nuovo in Android 6.0, Spinner ora ha il android:popupThemeparametro che consente di impostare il tema utilizzato per il popup (menu a discesa).

Puoi usarlo in questo modo:

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

Funzionerà sui dispositivi che eseguono il livello API 23+, ma non sui dispositivi che eseguono una versione inferiore di Android.

AppCompat

È qui che entra in gioco AppCompat. Supporta anche la sua implementazione Spinner popupTheme, ma è un po 'più complicato per avere ragione.

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

Dopodiché, è necessario aggiornare l'adattatore per poter lavorare con AppCompat. Lo fai implementando la nuova ThemedSpinnerAdapterinterfaccia.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Questi metodi vengono utilizzati da Spinner per essere in grado di indicare all'adattatore quale tema utilizzare per gonfiare le visualizzazioni a discesa. Per renderlo il più semplice possibile, ti abbiamo fornito un corso Helperche puoi collegare al tuo adattatore.

Ciò significa che il tuo adattatore diventa qualcosa come:

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();
  }
}

Ciao, non sono riuscito a trovare ThemedSpinnerAdapter all'interno di appcompat-v7. Sto usando la versione 22.2.1. Devo fare qualcosa di diverso per importarlo?
Douglas Alves

3
@DouglasAlves usa la più recente 23.0.0
khusrav

Sembra che Android Studio non sia a conoscenza dell'app: attributo popupTheme Spinner: "Prefisso dello spazio dei nomi imprevisto" app "trovato per il tag Spinner". Anche Lint non riesce con lo stesso errore.
makovkastar

1
@ Chris Banes: fornisce l'elenco a discesa con uno sfondo scuro, indipendentemente dal tema utilizzato.
Ashwin

2
dovrebbe usare "android.support.v7.widget.AppCompatSpinner" invece di "spinner" nell'XML?
Angel Koh

2

per la freccia dello spinner che ho usato android:backgroundTint="@color/white"funzionerà dall'API 21

per la visualizzazione Spinner e la visualizzazione a discesa:

ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);

areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);

per getView () l'adattatore utilizzerà spinner_item.xml

per getDropDownView () l'adattatore utilizzerà dropdwon_item.xml

quindi puoi utilizzare i tuoi layout personalizzati come preferisci

spero che sia d'aiuto


0

Solo per riferimento, se usi l' CursorAdapterimplementazione può essere molto più semplice, basta sovrascrivere newView(), non c'è bisogno di sovrascrivere getDropDownView()lì:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}

-6

puoi provare questo: nella cartella del layout crea 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" />

quindi usa questo codice:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);

6
Immagino che perché è abbastanza ovvio non risponde alla domanda. La domanda riguarda l'impostazione di un tema, non vedo alcun riferimento al tema in questa risposta. Solo così siamo chiari, non ho votato male, altri ci hanno già fatto abbastanza.
2Da
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.