Android:限制用户选择自动完成建议以外的其他内容?

我提供了一个AutoCompleteTextView来向用户显示建议。 根据用户选择的项目,我获取项目的ID并在数据库中使用它。 现在我的问题是强制用户仅从AutoCompleteTextView进行选择(即用户不应该输入他自己的文本)。 这是客户要求。 这个怎么做?

Solutions Collecting From Web of "Android:限制用户选择自动完成建议以外的其他内容?"

这是一个非常简单的解决方案:

您可以通过在AutoCompleteTextView设置setOnItemClickListener来创建一个存储所选值的variables。 然后,只要用户通过TextWatcher添加TextWatcher字段,就可以使该值为null 。 最后,您可以在继续之前validation您的variables是否为null。

 String my_var; //keep track! AutoCompleteTextView tv = (AutoCompleteTextView) layout.findViewById(R.id.tv); tv.setAdapter(my_adapter); tv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView< ?> parent, View view, int position, long id) { my_var = my_adapter.getItem(position).toString(); } }); /** * Unset the var whenever the user types. Validation will * then fail. This is how we enforce selecting from the list. */ tv.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { my_var = null; } @Override public void afterTextChanged(Editable s) {} }); 

我碰巧需要对我正在进行的项目提出这样的要求,而且我会按照我实现所需的方式与大家分享。

我为自动完成文本视图添加了焦点更改侦听器,并在用户将焦点从自动完成时更改为焦点时进行检查,并直接处理该情况。

 autoTextViewCountry.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { if(!b) { // on focus off String str = autoTextViewCountry.getText().toString(); ListAdapter listAdapter = autoTextViewCountry.getAdapter(); for(int i = 0; i < listAdapter.getCount(); i++) { String temp = listAdapter.getItem(i).toString(); if(str.compareTo(temp) == 0) { return; } } autoTextViewCountry.setText(""); } } }); 

所以我的实现是:如果数组适配器中不存在键入的文本,则焦点更改为空文本视图,稍后在继续下一阶段的注册时,检查此文本视图是否为空。

希望这种方法有助于某人。

快乐的编码。

NiceAutoCompleteTextView将使您能够通过调用isSelectionFromPopup()来检查是否通过下拉popup窗口进行了isSelectionFromPopup()

好吧我假设您希望将用户的输入限制为建议框中列出的项目列表中包含的文本。

例如,如果你有:

那么用户只能键入第一个字符“O”和“T”。 依据之前输入的文字等等。

要实现此目的,您可以使用TextViewsetFilters方法:

 editBox = (TextView) findViewById(R.id.editBox); editBox.setFilters(getFilters()); editBox.addTextChangedListener(this); editBox.setOnFocusChangeListener(this); 

另外,当输入新字符时,您可能需要文本更改侦听器焦点侦听器来响应并更新已过滤的列表…以及更新filter。

这是我在项目中使用的十进制数filter的示例:

 protected InputFilter[] getFilters() { InputFilter[] filters = new InputFilter[1]; filters[0] = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // limit input to digits and decimal / thousand separator only // in case thousand separator is pressed, change it to decimal // separator instead String output = ""; if (number.isFocused()) { for (int i = start; i < end; i++) { char c = source.charAt(i); if (isDecimalOrThousandSeparator(c)) { output = output + Character.toString(decimalSeparator); } else if (Character.isDigit(c)) { output = output + Character.toString(c); } } return output == "" ? null : output; } return null; } }; return filters; }