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

102

一个使用示例:

在此输入图片描述

这个Spinner是暗色主题的,但我希望下拉菜单是亮色主题的。

4个回答

195

安卓 M

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

嗨,我在appcompat-v7中找不到ThemedSpinnerAdapter。我正在使用版本22.2.1。我需要做些什么才能导入它吗? - Douglas Alves
3
@DouglasAlves 使用最新的23.0.0版本。 - khusrav
1
@Chris Banes:它会给下拉列表提供一个深色背景,无论你使用哪种主题。 - Ashwin
2
在XML中,应该使用“android.support.v7.widget.AppCompatSpinner”代替“spinner”吗? - Angel Koh
最后一个例子看起来非常类似于Android文档:} - Hack5
显示剩余5条评论

2

为了设置下拉框的箭头,我使用了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

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

希望这有所帮助


0

仅供参考,如果您使用CursorAdapter,您的实现可以更加简单,只需覆盖newView()即可,无需覆盖getDropDownView()

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

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

6
我猜因为它相当显而易见,所以它并没有回答问题。这个问题是关于设置主题的,我在这个回答中看不到任何关于主题的参考。只是为了明确,我没有给它投反对票,其他人已经足够了。 - 2Dee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接