如何为Spinner的下拉菜单设置不同的主题?
一个示例用法:
微调主题是黑暗的,但我希望下拉为主题。
Android M
在Android 6.0中,Spinner现在有了android:popupTheme
参数,它允许你设置用于popup(下拉菜单)的主题。
你可以这样使用它:
<Spinner android:layout_height="wrap_content" android:layout_width="match_parent" android:popupTheme="@android:style/ThemeOverlay.Material.Light" />
这将适用于运行API级别23+的设备,但不适用于运行较低版本Android的设备。
程序兼容性
这是AppCompat进来的地方。它的Spinner实现也支持popupTheme
,但是它有点涉及到正确的。
<Spinner android:layout_height="wrap_content" android:layout_width="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
之后,您需要更新您的适配器才能使用AppCompat。 通过使其实现新的ThemedSpinnerAdapter
接口来实现这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); }
你可以试试这个:在你的布局文件夹中创build一个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);