我有一个在spinnerMode="dropdown"
模式下的Spinner
。我想要向用户展示一个提示而不是预选的第一项,以便没有默认选择(例如“请选择一项”)
这是我当前的UI:
这是我想要实现的UI:
我发现EditText
小部件有一个android:hint
属性,但是Spinner
小部件没有,而且设置它并不能给我想要的UI。这是一个仅支持Android 4.x的应用程序,因此我不必担心任何先前版本的兼容性问题。
我有一个在spinnerMode="dropdown"
模式下的Spinner
。我想要向用户展示一个提示而不是预选的第一项,以便没有默认选择(例如“请选择一项”)
这是我当前的UI:
这是我想要实现的UI:
我发现EditText
小部件有一个android:hint
属性,但是Spinner
小部件没有,而且设置它并不能给我想要的UI。这是一个仅支持Android 4.x的应用程序,因此我不必担心任何先前版本的兼容性问题。
我还没有找到一个简单和清晰的解决方案,只有这个使用自定义适配器和自定义项目类的解决办法:
首先,我们需要为Spinner项目内容创建一个类:
class SpinnerItem {
private final String text;
private final boolean isHint;
public SpinnerItem(String strItem, boolean flag) {
this.isHint = flag;
this.text = strItem;
}
public String getItemString() {
return text;
}
public boolean isHint() {
return isHint;
}
}
然后是我们的适配器类:
class MySpinnerAdapter extends ArrayAdapter<SpinnerItem> {
public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) {
super(context, resource, objects);
}
@Override
public int getCount() {
return super.getCount() - 1; // This makes the trick: do not show last item
}
@Override
public SpinnerItem getItem(int position) {
return super.getItem(position);
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
}
最后我们像这样使用解决方法:
ArrayList<SpinnerItem> items = new ArrayList<SpinnerItem>();
items.add(new SpinnerItem("Item 1", false));
items.add(new SpinnerItem("Item 2", false));
items.add(new SpinnerItem("HINT", true)); // Last item
MySpinnerAdapter adapter = new MySpinnerAdapter(this, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(items.size() - 1);
然后您可以使用SpinnerItem类中的标志来为该项设置文本颜色或其他任何内容。
AdapterView.OnItemSelectedListener
类,并在onItemSelected
方法中执行了SpinnerItem data = items.get(position);
,接着是if (data.isHint() {do stuff}
。 - Someone Somewhere