如何为微调框的下拉菜单设置不同的主题?


Answers:


195

Android M

Spinner现在是Android 6.0中的新功能,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使用这些方法来告诉Adapter使用哪个主题来放大任何下拉视图。为了使此操作尽可能简单,我们为您提供了一个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。导入它是否需要做些其他的事情?
道格拉斯·阿尔维斯

3
@DouglasAlves使用最新的23.0.0
khusrav

似乎Android Studio不了解app:popupTheme Spinner属性:“为代码Spinner找到了意外的名称空间前缀“ app””。棉绒也失败,并显示相同的错误。
makovkastar

1
@Chris Banes:不管您使用什么主题,它都会为深色背景的下拉列表提供帮助。
Ashwin

2
它应该在XML中使用“ android.support.v7.widget.AppCompatSpinner”而不是“ spinner”吗?
Angel Koh

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

-6

您可以尝试以下操作:在布局文件夹中创建一个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 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.