如何向Spinner小部件添加提示?

15

我有一个在spinnerMode="dropdown"模式下的Spinner。我想要向用户展示一个提示而不是预选的第一项,以便没有默认选择(例如“请选择一项”)

这是我当前的UI:

当前UI

这是我想要实现的UI:

我想要实现的UI

我发现EditText小部件有一个android:hint属性,但是Spinner小部件没有,而且设置它并不能给我想要的UI。这是一个仅支持Android 4.x的应用程序,因此我不必担心任何先前版本的兼容性问题。


1
android:prompt="@String/select" 是否有效? - Sahil Mahajan Mj
1
很遗憾,这个提示是针对在点击“Spinner”小部件后出现的下拉菜单的。而且如果使用Android 4.x中新的Holo主题,则无法正常工作。 - Jens Kohl
Spinner适配器有不同的方法,一个用于下拉视图,另一个用于包含所有选项的列表视图。因此,当没有选择任何内容时,您的适配器默认返回此TextView,否则返回所选项目。 - S.D.
1
@izaakcito 我可能会采用这个解决方案:https://dev59.com/a2w15IYBdhLWcg3wcrdC#12386866。一旦我完成了,我会在这个问题中更新我的解决方案。 - Jens Kohl
https://android--code.blogspot.in/2015/08/android-spinner-hint.html 另一个好的教程 - Prabs
1个回答

24

我还没有找到一个简单和清晰的解决方案,只有这个使用自定义适配器和自定义项目类的解决办法:

首先,我们需要为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类中的标志来为该项设置文本颜色或其他任何内容。


不错!我喜欢这个解决方法。问题是:编辑文本中提示文本的颜色是什么? - Someone Somewhere
为了设置提示文本的颜色,我实现了AdapterView.OnItemSelectedListener类,并在onItemSelected方法中执行了SpinnerItem data = items.get(position);,接着是if (data.isHint() {do stuff} - Someone Somewhere
3
谢谢,那个方法非常有效。:) 另外一件事,如果你想使用List<String>,不需要创建单独的类(例如SpinnerItem)。 - Kalpesh Lakhani
3
你的适配器出了问题,它显示给列表的是包名而不是我提供的值。请帮忙修改并保持原意不变。 - Oussaki
1
@chhameed 是的,我找到了解决这个问题的方法... 只需要在适配器中进行一点小改动...通过将项目的数量设置为count-1,并在列表项中添加您想要默认显示的值...现在它对我起作用了...并且尽量不使用他的item类,只使用默认的items...就是这样。如果有任何问题,我可以提供我的代码。问候。 - Oussaki
显示剩余6条评论

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