Edittext Validation с TextWatcher
-
27-09-2019 - |
Вопрос
У меня есть диалог с EditText
и кнопка. Этот EditText
Назовите таблицу базы данных, которую я создам, чтобы ее максимальное значение было подтверждено. Поэтому я хотел бы поставить 2 вопроса:
1) Это довольно просто, но я не мог нигде не удалось: на каких символах может принять имя таблицы базы данных? Может ли он принимать цифры? И может ли номер быть первым персонажем?
2) Мне удалось подтвердить EditText
с использованием TextWtacher
. Отказ Вот код:
et_name.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
String filtered_str = s.toString();
if (filtered_str.matches(".*[^a-z^0-9].*")) {
filtered_str = filtered_str.replaceAll("[^a-z^0-9]", "");
s.clear();
// s.insert(0, filtered_str);
Toast.makeText(context,
"Only lowercase letters and numbers are allowed!",
Toast.LENGTH_SHORT).show();
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
В настоящее время, если пользователь вставит любой символ, отличный от строчных букв и цифр, текстовое поле очищено. Если я беспокойтесь s.insert(0, filtered_str);
Для того, чтобы заменить EDITTEXT с помощью фильтрованной строки, мое приложение зависает. И угадайте, что я нахожу в отладке?
Ошибка / androidruntime (2454): java.lang.StackOverflowError
= D.
Вопрос в том, как я могу заменить текст?
-> s.replace(0, s.toString().length(), filtered_str);
(Удалить S.celear, конечно), похоже, тоже не работает.
Решение 2
После некоторых головных платежей я наконец нашел решение. Кажется S.append (Filtered_str) после S.Clear () работает. Не знаю, почему он не работает раньше.
Другие советы
private TextWatcher listenerTextChangedFiltro = new TextWatcher() {
public void afterTextChanged(Editable editable) {
final String textoFiltrado = StaticString.filterTextCustom(String.valueOf(editable.toString().toLowerCase()));
if (!textoFiltrado.equals(editable.toString().toLowerCase())) {
editable.clear();
editable.append(textoFiltrado);
}
}
};
Привет! Я пробую подобную вещь с принуждением входного текста все строчные; S.CLEAR (), а затем S.Append (), вызывает для меня стопку для меня (или еще).
Интересно, почему Android кладет нам обручи за заставить преобразование в строчные?
Поскольку использование TextWatcher было разбито для меня (справедливо так ... и я не мог выяснить, как работать охватывает), я посмотрел на TransformationMethod.
1-й попытку состоять в том, чтобы сделать встроенный преобразование Method на Edittext с чем-то вроде этого:
et.setTransformationMethod(new TransformationMethod() {
public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction,
Rect previouslyFocusedRect) {
}
public CharSequence getTransformation(CharSequence source, View view) {
String ret = source.toString().toLowerCase();
System.out.println(ret);
return ret;
}
});
Это вызвало сбой благодаря indexarrayoutOfBounds, как только я набрал один символ в ET ... не смог понять, почему.
Итак, я проверил код для PasswordTransformation, а затем заменатрасформация - оба кажутся очень сложными, и я не хотел беспокоиться со всеми такими?
Затем в проверенном подклассе SingleLinElinEnranshation, который был простым ... Итак, я создал низкоквадрасформацию как подкласс замены трансформации следующим образом:
public class LowerCaseReplacement extends ReplacementTransformationMethod {
private static final char[] ORIG = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static final char[] REPS = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
private static LowerCaseReplacement singleton;
@Override
protected char[] getOriginal() {
return ORIG;
}
@Override
protected char[] getReplacement() {
return REPS;
}
public static LowerCaseReplacement getInstance() {
if (singleton == null)
singleton = new LowerCaseReplacement();
return singleton;
}
}
и добавление этого XForm to et ... как в et.settransformationmethod (lowncaseReplacement.getinstnace ()) ...
Это работает!!
Если у кого-то есть лучшее решение, пожалуйста, просветите!
Проблема в том, что, когда вы вызываете метод вставки, текстовый метод изменен снова. Это приводит к замкнутому кругу, таким образом, переполнение стека. Вы можете избежать этого, не заменяя строку, которая правильно отформатирована.