如何为Spinner的下拉列表设置不同的主题?

Chr*_*nes 102 android android-appcompat

示例用法:

在此输入图像描述

旋转器是黑暗的主题,但我希望下拉菜单是主题.

Chr*_*nes 195

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" />
Run Code Online (Sandbox Code Playgroud)

这适用于运行API级别23+的设备,但不适用于运行较低版本Android的设备.

程序兼容性

这就是AppCompat的用武之地.它的Spinner实现也支持popupTheme,但是要更好地参与其中.

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Run Code Online (Sandbox Code Playgroud)

之后,您需要更新适配器才能使用AppCompat.您可以通过实现新ThemedSpinnerAdapter界面来实现.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}
Run Code Online (Sandbox Code Playgroud)

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @DouglasAlves使用最新的23.0.0 (3认同)
  • 它应该在xml中使用"android.support.v7.widget.AppCompatSpinner"而不是"spinner"吗? (2认同)