Jak ustawić inny motyw dla listy rozwijanej Spinner?

102

Przykładowe użycie:

wprowadź opis obrazu tutaj

The Spinner ma ciemny motyw, ale chcę, aby lista rozwijana była jasna.

Chris Banes
źródło

Odpowiedzi:

195

Android M.

Nowość w systemie Android 6.0, Spinner ma teraz android:popupThemeparametr, który pozwala ustawić motyw używany dla wyskakującego okienka (menu rozwijanego).

Możesz go używać tak:

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

Będzie to działać na urządzeniach z poziomem API 23+, ale nie na urządzeniach z niższą wersją Androida.

AppCompat

W tym miejscu pojawia się AppCompat. Jego implementacja Spinner również obsługuje popupTheme, ale jest nieco bardziej zaangażowana, aby uzyskać właściwą.

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

Następnie musisz zaktualizować swój adapter, aby móc pracować z AppCompat. Robisz to, wdrażając nowy ThemedSpinnerAdapterinterfejs.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Spinner używa tych metod, aby móc wskazać adapterowi, którego motywu użyć do zawyżenia dowolnych rozwijanych widoków. Aby było to tak proste, jak to tylko możliwe, przygotowaliśmy Helperklasę, którą możesz podłączyć do adaptera.

Oznacza to, że twój adapter staje się czymś takim:

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
źródło
Cześć, nie mogłem znaleźć ThemedSpinnerAdapter wewnątrz appcompat-v7. Używam wersji 22.2.1. Czy muszę zrobić coś innego, aby go zaimportować?
Douglas Alves
3
@DouglasAlves używa najnowszego 23.0.0
khusrav
Wygląda na to, że Android Studio nie wie o aplikacji: popupTheme Atrybut Spinner: „Znaleziono nieoczekiwany prefiks przestrzeni nazw„ aplikacja ”dla tagu Spinner”. Lint również kończy się niepowodzeniem z tym samym błędem.
makovkastar
1
@Chris Banes: Lista rozwijana ma ciemne tło, niezależnie od używanego motywu.
Ashwin,
2
czy powinien używać „android.support.v7.widget.AppCompatSpinner” zamiast „spinner” w pliku XML?
Angel Koh
2

dla strzały obrotowej, której użyłem, android:backgroundTint="@color/white"będzie działać z API 21

dla widoku pokrętła i widoku rozwijanego:

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

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

dla getView () adapter użyje spinner_item.xml

dla getDropDownView () adapter użyje dropdwon_item.xml

wtedy możesz dowolnie używać własnych układów

mam nadzieję, że to pomoże

bsma
źródło
0

Tylko w celach informacyjnych, jeśli używasz CursorAdapterswojej implementacji, może być znacznie łatwiejsze, po prostu zastąp newView(), nie ma potrzeby zastępowania w tym getDropDownView()miejscu:

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

możesz spróbować tego: w folderze układu utwórz 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" />

następnie użyj tego kodu:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);
Ahmad Azarnia
źródło
6
Myślę, że ponieważ jest dość oczywiste, nie odpowiada na pytanie. Pytanie dotyczy ustalenia tematu, nie widzę w tej odpowiedzi odniesienia do motywu. Żeby było jasne, nie przegłosowałem tego, inni już to zrobili.
Zobacz