#android #android-softkeyboard #android-textwatcher
#Android #android-программная клавиатура #android-textwatcher
Вопрос:
Мой телефон был только что обновлен с 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, а значение stype равно 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 amp;amp; // 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:
Я разобрался с этим, хотя и не понимаю, зачем это требуется, поскольку я ничего не менял в EditText.
Я изменил последние несколько строк кода, объявив курсор перед условным обозначением, добавив возврат к внутреннему условному обозначению и добавив две строки после этого для stype 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 amp;amp; // 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));
}
};