Если у вас есть EditText
и вы присваиваете ему InputFilter
, то каждый раз, когда вы меняете текст, будет вызываться метод filter()
. Очень похоже на onClick()
метод кнопки.
Допустим, перед редактированием у вас был текст "Hello Androi" в вашем EditText. Если вы нажмете
клавиша D
на вашей виртуальной клавиатуре, после чего срабатывает фильтр ввода и в основном спрашивается, можно ли добавить d
.
В этом случае source
- это «Android», начало - 6, конец - 7 - это ваша ссылка на новый текст.
dest
будет "Androi" и относится к старому тексту в вашем EditText
Таким образом, вы получаете новую строку и позицию в этой строке (6,7), которую вы должны проверить, все ли в порядке. Если бы вы просто получили один символ (например, d
), вы не могли бы решить, например, номер, который вы только что ввели, образует IP-адрес. В некоторых случаях вам нужен весь текст в качестве контекста.
Если с новым текстом все в порядке, как и при возврате, null
, если вы хотите пропустить изменение, верните пустую строку (""
), в противном случае верните символы, которые заменяют изменение.
Итак, простой пример:
/**
* Simplified filter that should make everything uppercase
* it's a demo and will probably not work
* - based on InputFilter.AllCaps
*/
public static class AllCaps implements InputFilter {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
// create a buffer to store the edited character(s).
char[] v = new char[end - start];
// extract the characters between start and end into our buffer
TextUtils.getChars(source, start, end, v, 0);
// make the characters uppercase
String s = new String(v).toUpperCase();
// and return them
return s;
}
}
Он заменяет каждое изменение на заглавную версию.