Android: запретить пользователю выбирать только текст из автозаполнения - программирование
Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Вы можете создать переменную для сохранения выбранного значения, установив 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) {}
});

Ответ 2

Мне понадобилось такое требование для проекта, над которым я работаю, и я, хотя я расскажу вам, ребята, как я это сделал.

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

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("");

            }
        }
    });

Итак, моя реализация такова: если введенный текст не существует в адаптере массива, тогда в фокусе изменилось пустое текстовое представление, а позже, когда вы продолжаете следующий этап регистрации, проверьте, пусто ли это текстовое представление или нет.

Надеюсь, что этот подход поможет кому-то.

Счастливое кодирование.

Ответ 3

NiceAutoCompleteTextView даст вам возможность проверить, был ли выделен выбор из раскрывающегося списка, путем вызова isSelectionFromPopup()

Ответ 4

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

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

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

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

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

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