安卓 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();
}
}
为了设置下拉框的箭头,我使用了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
然后您可以根据需要使用自定义布局
希望这有所帮助
仅供参考,如果您使用CursorAdapter
,您的实现可以更加简单,只需覆盖newView()
即可,无需覆盖getDropDownView()
:
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}
<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);