如何为 Spinner 的下拉菜单设置不同的主题?

How do I set a different theme for a Spinner's dropdown?

用法示例:

微调器是深色主题,但我希望下拉菜单是浅色主题。

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) { ... }

}

微调器使用这些方法来告诉适配器使用哪个主题来扩充任何下拉视图。为了尽可能简单,我们为您提供了一个 Helper class,您可以将其插入适配器。

这意味着您的适配器会变成这样:

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

你可以试试这个: 在您的布局文件夹中创建 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);

仅供参考,如果您使用 CursorAdapter,您的实施会更容易,只需覆盖 newView(),无需覆盖 getDropDownView()

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

对于微调器的箭头我已经使用了android:backgroundTint="@color/white"这将从API21

开始工作

对于微调视图和下拉视图:

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

然后您可以根据需要使用自定义布局

希望对您有所帮助