Пожалуйста, кто-нибудь может объяснить мне назначение параметров источника и dest в android.text.InputFilter#filter
?
Я попытался прочитать документы, но я действительно смущен. Я пытаюсь использовать регулярное выражение для создания маски IP. Любая помощь приветствуется.
Я понял это сейчас. Так, например, если у меня 123.42, тогда пользователь вводит 123.42d, у меня будет:
dest = 123.42
source = 123.42d
start = 5
end = 6
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter()
{
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
{
String destTxt = dest.toString();
String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend);
if(resultingTxt.equals("")) return "";
int lastChar = resultingTxt.length() -1;
if(String.valueOf(resultingTxt.charAt(lastChar)).matches("[^0-9.]"))
{
return "";
}
return null;
}
};
Это не работает. Разве это не возвращает мне только цифры? Бывает, что в зависимости от того, какой тип пользователя он возвращает, меня тоже обозначают.
Если у вас есть EditText
и вы присваиваете ему InputFilter
, то каждый раз, когда вы меняете текст, там будет вызываться метод filter()
. Очень похоже на метод onClick()
кнопки.
Скажем, у вас был текст "Hello Androi" в вашем EditText перед его редактированием. Если вы нажмете
клавишей D
на вашей виртуальной клавиатуре, тогда входной фильтр запускается и в основном спрашивает, нормально ли добавить D
.
В этом случае source
есть "Android", начало - 6, конец - 7. Это ваша ссылка на новый текст.
dest
будет "Androi" и ссылается на старый текст в вашем EditText
Итак, вы получаете новую строку и позицию в этой строке (6,7), которую вы должны проверить, хорошо ли это. Если вы просто получите один символ (например, D
), вы не сможете решить, например, например, номер, который вы только что ввели, формирует ip-адрес. В некоторых случаях вам нужен весь текст в качестве контекста.
Если новый текст в порядке, как возвращается null
, если вы хотите пропустить изменение, возвращайте пустую строку String (""
), в противном случае верните символы, заменяющие изменение.
Таким образом, простой пример может заключаться в следующем:
/**
* Simplified filter that should make everything uppercase
* it 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;
}
}
Он заменяет каждое изменение его версией в верхнем регистре.