Решение с InputFilter
, предоставленное здесь, не является на 100% правильным, поскольку оно заменит и выбросит некоторые допустимые символы из ввода, если они находятся рядом с неверным.
Например, нам нужноотфильтровывая все специальные символы, и вы вводите текст: olala [
Поле EditText передаст целое предложение olala[
в фильтр, а возвращаемое значение будет "", означая, что мы бросаемиз допустимых olala .
Вот мое решение:
InputFilter filter = (source, start, end, dest, dstart, dend)->{
for (int i = start; i < end; i++) {
char symbol = source.charAt(i);
if (!isValidCharacter(symbol)) {
StringBuilder buf = new StringBuilder();
for(int j = start; j < end; j++)
{
symbol = source.charAt(j);
if(isValidCharacter(symbol)) buf.append(symbol);
}
return buf.toString();
}
}
return null;
};
Нам нужен здесь двойной цикл, чтобы избежать выделения памяти StringBuilder для каждого вызова метода с допустимыми символами,