Может кто-нибудь помочь мне с параметрами метода Android «InputFilter» «фильтр»? (плюс регулярное выражение) - PullRequest
1 голос
/ 22 марта 2012

Пожалуйста, кто-нибудь может объяснить мне назначение параметров source и 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;
        }
    };

Это не работает, хотя.Разве это не должно вернуть мне только цифры?Бывает, что в зависимости от того, какой тип пользователя он возвращает, я тоже получаю символы.

1 Ответ

11 голосов
/ 22 марта 2012

Если у вас есть 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;
    }
}

Он заменяет каждое изменение на заглавную версию.

...