Jak ustawić inny motyw dla listy rozwijanej Spinner?


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

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


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.