Intereting Posts

Android: запретить пользователю выбирать только текст автозаполнения

Я предоставил текст автозаполнения, чтобы показать предложения пользователю. Основанный на элементе, выбранном пользователем, я получаю идентификатор элемента и использую его в стороне базы данных. Теперь моя проблема заключается в том, чтобы запретить пользователю делать выбор только из автозаполнения textview (т. Е. Пользователь не должен вводить свой собственный текст). Это требование клиента. Как это сделать?

Solutions Collecting From Web of "Android: запретить пользователю выбирать только текст автозаполнения"

Вот довольно простое решение:

Вы можете создать переменную для сохранения выбранного значения, установив setOnItemClickListener в свой AutoCompleteTextView . Затем вы можете null это значение всякий раз, когда пользователь вводит в поле, добавляя к нему TextWatcher . Наконец, вы можете проверить, что ваша переменная не имеет значения 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() , путем вызова isSelectionFromPopup()

Хорошо, я предполагаю, что вы хотели бы ограничить ввод пользователя текстами, содержащимися в списке элементов, перечисленных в поле предложения.

Например, если у вас есть:

  • Один
  • Два
  • Три

То пользователь может вводить только первый символ «O» и «T». И так далее в соответствии с введенным ранее текстом.

Для этого вы можете использовать метод setFilters TextView :

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

Кроме того, вам, вероятно, понадобится прослушиватель смены текста и прослушиватель фокуса, чтобы реагировать и обновлять отфильтрованный список при вводе нового символа … плюс обновить фильтр.

Вот пример фильтра десятичных чисел, который я использовал в проекте:

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