Как установить другую тему для выпадающего списка Spinner?

Пример использования:

введите описание изображения здесь

Спиннер темный, но я хочу, чтобы выпадающий список был светлым.

Ответ 1

Android M

Новое в Android 6.0, теперь у Spinner есть параметр android:popupTheme, который позволяет вам установить тему, используемую для всплывающего окна (dropdown).

Вы можете использовать его так:

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

Это будет работать на устройствах с уровнем API 23+, но не на устройствах с более низкой версией Android.

AppCompat

Здесь присутствует приложение AppCompat. Его реализация Spinner также поддерживает popupTheme, но это немного более важно для правильного.

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

После этого вам нужно обновить свой адаптер, чтобы иметь возможность работать с AppCompat. Вы делаете это, создавая для него новый ThemedSpinnerAdapter интерфейс.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Эти методы используются Spinner, чтобы иметь возможность рассказать адаптеру, какую тему использовать для раздувания любых раскрывающихся представлений. Чтобы сделать это как можно проще, мы предоставили вам Helper класс, который вы можете подключить к своему адаптеру.

Это означает, что ваш адаптер становится чем-то вроде:

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

Ответ 2

Просто для справки, если вы используете CursorAdapter, ваша реализация может быть намного проще, просто переопределите newView(), нет необходимости переопределять getDropDownView() там:

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

Ответ 3

вы можете попробовать следующее: в вашей папке макета сделайте 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" />

то используйте этот код:

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