Пример использования:
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();
}
}
для стрелки прядильщика, которую я использовал, android:backgroundTint="@color/white"
это будет работать с API 21
для просмотра счетчика и раскрывающегося списка:
ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);
areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);
для getView () адаптер будет использовать spinner_item.xml
для getDropDownView () адаптер будет использовать dropdwon_item.xml
тогда вы можете использовать свои собственные макеты по своему усмотрению
Надеюсь, поможет
Просто для справки, если вы используете 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);