onTextChanged TextWatcher проблема с Android 7.0 - PullRequest
0 голосов
/ 08 марта 2019

Мой телефон только что обновился с Android 6.0 до 7.0.После обновления я замечаю, что функция в моем приложении работает неправильно, то есть EditText не будет принимать введенный символ и вместо этого будет повторять ранее введенный символ.Клавиатура управления установлена ​​на CapCharacter, поэтому есть заглавные буквы.Если я установил его в Caps Lock, он будет работать правильно.

Ниже приведены соответствующие сегменты кода

    <EditText
    android:id="@+id/etEntry"
    style="@android:style/Widget.EditText"
    android:digits="cvABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789*?.,^+[](|){}\\~-"
    android:hint="@string/searchterm"
    android:imeOptions="actionSearch|flagForceAscii"
    android:inputType="textCapCharacters|textNoSuggestions"
    android:singleLine="true"
    android:visibility="visible"
    tools:hint="Search Term" />

Для элемента управления есть TextWatcher, а значение стиля равно 3 (шаблон)поэтому он обходит секцию, которая изменяет ввод.

        private boolean mWasEdited = false;
    @Override
    public void afterTextChanged(Editable s) {
        if (mWasEdited){
            mWasEdited = false;
            return;
        }
        mWasEdited = true;
        String enteredValue  = s.toString();
        if (stype.getSelectedItemPosition() != 3) { // not pattern
            String newValue = enteredValue.replaceAll("[cv0123456789.,^+-]", "");
            int caret = etTerm.getSelectionStart();
            if (stype.getSelectedItemPosition() != 0 && // not anagram
                    stype.getSelectedItemPosition() != 3) { // and not pattern
                newValue = newValue.replaceAll("[*]", "");
            }
            if (Arrays.asList(2,7,8).contains(stype.getSelectedItemPosition())) { // hooks, begins, ends
                newValue = newValue.replaceAll("[?]", "");
            }
            etTerm.setText(newValue);
            etTerm.setSelection(Math.min(newValue.length(), caret)); // if first char is invalid
        }
    }
};

Я предполагаю, что мне нужно либо настроить параметры клавиатуры для элемента управления, но что-то делать - onTextChanged.Это загадка.

1 Ответ

0 голосов
/ 08 марта 2019

Я понял это, хотя я не понимаю, почему это требуется, поскольку я ничего не изменил в EditText.

Я изменил последние несколько строк кода, объявив каретку перед условным, добавиввозврат к внутреннему условному условию и добавление двух строк после него для стиля 3.

    public void afterTextChanged(Editable s) {
        if (mWasEdited){
            mWasEdited = false;
            return;
        }
        mWasEdited = true;
        String enteredValue  = s.toString();
        int caret = etTerm.getSelectionStart();
        if (stype.getSelectedItemPosition() != 3) { // not pattern
            String newValue = enteredValue.replaceAll("[cv0123456789.,^+-]", "");
            if (stype.getSelectedItemPosition() != 0 && // not anagram
                    stype.getSelectedItemPosition() != 3) { // and not pattern
                newValue = newValue.replaceAll("[*]", "");
            }
            if (Arrays.asList(2,7,8).contains(stype.getSelectedItemPosition())) {
                newValue = newValue.replaceAll("[?]", "");
            }
            etTerm.setText(newValue);
            etTerm.setSelection(Math.min(newValue.length(), caret)); 
            return;
        }
        etTerm.setText(enteredValue);
        etTerm.setSelection(Math.min(enteredValue.length(), caret)); 
    }
};
...