如何为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);