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

1

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

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

  • 0
    что это за метод фильтра CharSequencer, на который вы ссылаетесь? Есть ли API-документ / или хотя бы объявление метода?
  • 0
    Тот, когда вы создаете экземпляр нового InputFilter. Я забыл добавить это к вопросу, извините.
Показать ещё 3 комментария
Теги:
mask
ip

1 ответ

10
Лучший ответ

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

Он заменяет каждое изменение его версией в верхнем регистре.

  • 0
    Взгляните на мою правку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню