EditText setSelection очищает текст, а затем повторно вводит - PullRequest
0 голосов
/ 24 сентября 2018

У меня были проблемы с некоторыми странными поведениями из EditText .setSelection, с которыми я надеюсь, что вы все можете помочь!

В приложении, над которым я работаю, есть поле поиска, и необходимо иметьон ведет себя очень похоже на панель поиска браузера.Например, если пользователь вводит «fo», мы бы хотели, чтобы EditText автоматически заполнял до «foobar» с выделенным автозаполненным «obar» текстом, чтобы его можно было легко заменить пользователем, если автозаполнение не соответствует тому, что предполагал пользовательнабрать.

Для этого у меня есть поле EditText с настройкой TextWatcher, чтобы попытаться автоматически завершить текст afterTextChanged.Вот мой код:

    editText.addTextChangedListener(new TextWatcher() {
        int lastCount = 0;

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            editText.removeTextChangedListener(this);
            String searchString = editable.toString();
            if (editable.length() > lastCount) {
                lastCount = editable.length();
                int oldLength = searchString.length();
                String autoFillResult = completeAutofill(searchString);
                if (!autoFillResult.equals("")) {
                    searchString = autoFillResult;
                    editable.clear();
                    editable.append(autoFillResult);
                    editText.setSelection(oldLength, autoFillResult.length());
                }

            } else lastCount = editable.length();

            editText.addTextChangedListener(this);
        }
    });

Моя проблема заключается в следующем.Используя предыдущий случай «Foobar»:

  1. Пользователь вводит «F», EditText автоматически заполняет «oobar» и выделяет его.

  2. Затемпользователь вводит первое «o»

  3. Поле EditText на мгновение очищается (т. е. afterTextChanged получает Editable с пустой строкой)

  4. TheEditText правильно автоматически заполняет введенный пользователем «Fo», за которым следует автозаполненный «obar», который выделен.

Проблема заключается в том, что EditText очищается, а затем снова заполняется, когда пользователь вводит следующий символ, которыйсоздает заметное нарушение в поле EditText.Интересно, что я выделил editText.setSelection (oldLength, autoFillResult.length ());как виновник (т.е. комментирование строки избавляет от проблемы, но, очевидно, это неправильная функциональность).

После завершения некоторых исследований Google и моей собственной отладки, я все еще не уверен, почему это происходит.Эта проблема не встречается слишком часто, так как я не смог найти ее в Google и не смог выяснить причину этой проблемы в своих собственных экспериментах.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

условие if должно быть:

autoFillResult != null && !autoFillResult.equals("")

, в то время как вы, возможно, ищете (или пытаетесь воссоздать) AutoCompleteTextView .

0 голосов
/ 24 сентября 2018

Попробуйте удалить editable.clear();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...