Wie lege ich ein anderes Thema für das Dropdown-Menü eines Spinners fest?

102

Ein Anwendungsbeispiel:

Geben Sie hier die Bildbeschreibung ein

Der Spinner hat ein dunkles Thema, aber ich möchte, dass das Dropdown-Thema hell ist.

Chris Banes
quelle

Antworten:

195

Android M.

Spinner ist neu in Android 6.0 und verfügt nun über den android:popupThemeParameter, mit dem Sie das für das Popup verwendete Thema (Dropdown) festlegen können.

Sie können es so verwenden:

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

Dies funktioniert auf Geräten mit API-Level 23+, jedoch nicht auf Geräten mit einer niedrigeren Android-Version.

AppCompat

Hier kommt AppCompat ins Spiel. Die Spinner-Implementierung unterstützt ebenfalls popupTheme, aber es ist etwas komplizierter, das Richtige zu tun .

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

Danach müssen Sie Ihren Adapter aktualisieren, um mit AppCompat arbeiten zu können. Sie tun dies, indem Sie die neue ThemedSpinnerAdapterSchnittstelle implementieren .

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Diese Methoden werden von Spinner verwendet, um dem Adapter mitzuteilen, welches Thema zum Aufblasen von Dropdown-Ansichten verwendet werden soll. Um dies so einfach wie möglich zu gestalten, haben wir Ihnen eine HelperKlasse gegeben, die Sie an Ihren Adapter anschließen können.

Dies bedeutet, dass Ihr Adapter so etwas wie:

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();
  }
}
Chris Banes
quelle
Hallo, ich konnte ThemedSpinnerAdapter in der Appcompat-v7 nicht finden. Ich verwende Version 22.2.1. Muss ich etwas anderes tun, um es zu importieren?
Douglas Alves
3
@ DouglasAlves verwenden die neuesten 23.0.0
Khusrav
Es scheint, dass Android Studio nichts über die App weiß: popupTheme Spinner-Attribut: "Unerwartetes Namespace-Präfix" App "für Tag Spinner gefunden". Lint versagt auch mit dem gleichen Fehler.
Makovkastar
1
@ Chris Banes: Es gibt die Dropdown-Liste mit einem dunklen Hintergrund, unabhängig vom verwendeten Thema.
Ashwin
2
sollte es "android.support.v7.widget.AppCompatSpinner" anstelle von "spinner" in der XML verwenden?
Angel Koh
2

Für den Spinnerpfeil, den ich verwendet habe, android:backgroundTint="@color/white"funktioniert dies ab API 21

für Spinneransicht und Dropdown-Ansicht:

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

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

Für getView () verwendet der Adapter spinner_item.xml

Für getDropDownView () verwendet der Adapter dropdwon_item.xml

Dann können Sie Ihre benutzerdefinierten Layouts nach Belieben verwenden

ich hoffe es hilft

bsma
quelle
0

Nur als Referenz, wenn Sie die verwenden CursorAdapter, kann Ihre Implementierung viel einfacher sein, einfach überschreiben newView(), keine Notwendigkeit, getDropDownView()dort zu überschreiben :

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

Sie können dies versuchen: Erstellen Sie in Ihrem Layout-Ordner eine 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" />

Verwenden Sie dann diesen Code:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);
Ahmad Azarnia
quelle
6
Ich denke, weil es ziemlich offensichtlich ist, beantwortet es die Frage nicht. Bei der Frage geht es darum, ein Thema festzulegen. Ich sehe in dieser Antwort keinen Hinweis auf das Thema. Nur damit wir klar sind, habe ich das nicht abgelehnt, andere haben es schon genug gemacht.
2Dee