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

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

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

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

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

Android M

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

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

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

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

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

Вы можете попробовать это: в папке макета сделайте 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);