Проверка EditText с TextWatcher - PullRequest
       1

Проверка EditText с TextWatcher

7 голосов
/ 22 ноября 2010

У меня есть диалог с EditText и кнопкой.Это EditText назовет таблицу базы данных, которую я создам, поэтому она имеет первостепенное значение для проверки.Итак, я хотел бы задать 2 вопроса:

1) Это довольно просто, но я нигде не смог его найти: какие символы может принять имя таблицы базы данных?Может ли он принимать цифры?И может ли число быть первым символом?

2) Мне удалось проверить EditText с помощью TextWtacher.Вот код:

et_name.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {

    String filtered_str = s.toString();

        if (filtered_str.matches(".*[^a-z^0-9].*")) {

        filtered_str = filtered_str.replaceAll("[^a-z^0-9]", "");

        s.clear();

        // s.insert(0, filtered_str);

        Toast.makeText(context,
            "Only lowercase letters and numbers are allowed!",
            Toast.LENGTH_SHORT).show();

    }

}

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    public void onTextChanged(CharSequence s, int start, int before, int count) {}
});

В настоящее время, если пользователь вставляет любой символ, кроме строчных букв и цифр, текстовое поле очищается.Если я раскомментирую s.insert(0, filtered_str);, чтобы заменить EditText отфильтрованной строкой, мое приложение зависнет.И угадайте, что я нахожу в отладке?

ОШИБКА / AndroidRuntime (2454): java.lang.StackOverflowError = D

Вопрос в том ... как заменить текст s?

-> s.replace(0, s.toString().length(), filtered_str); (конечно, удалить s.clear) тоже не работает.

Ответы [ 4 ]

8 голосов
/ 26 декабря 2012
private TextWatcher listenerTextChangedFiltro = new TextWatcher() {
        public void afterTextChanged(Editable editable) {

                final String textoFiltrado = StaticString.filterTextCustom(String.valueOf(editable.toString().toLowerCase()));
                if (!textoFiltrado.equals(editable.toString().toLowerCase())) {
                    editable.clear();
                    editable.append(textoFiltrado);
                }
         }
};
6 голосов
/ 23 ноября 2010

После некоторых ударов головой я наконец нашел решение. Кажется, s.append (Filter_str) после того, как s.clear () работает. Не знаю, почему это не сработало раньше.

1 голос
/ 02 декабря 2010

эй!я пытаюсь сделать то же самое с принудительным вводом текста в нижнем регистре;s.clear (), за которым следует s.append (), вызывает и для меня (или все еще) StackOverflow.

Интересно, почему Android помещает нас через обручи для принудительного преобразования в нижний регистр?

Так какиспользование TextWatcher для меня не удавалось (правильно ... и я не мог понять, как работать пролеты), я посмотрел на TransformationMethod.

Первая попытка состояла в том, чтобы сделать встроенный метод TransformationMethod для EditText примерно так:

et.setTransformationMethod(new TransformationMethod() {

        public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction,
                Rect previouslyFocusedRect) {
        }

        public CharSequence getTransformation(CharSequence source, View view) {
            String ret = source.toString().toLowerCase();
            System.out.println(ret);
            return ret;
        }
    });

Это вызвало сбой из-за IndexArrayOutOfBounds, как только я набрал один символ в ET.Не могу понять, почему.

Итак, я проверил код для PasswordTransformation и затем ReplacementTransformation - оба кажутся очень сложными, и я не хотел беспокоиться обо всем этом? материале?.

Затем проверил подкласс SinglelineTransformation, который был прост ... поэтому я создал LowerCaseTransformation в качестве подкласса ReplacementTransformation следующим образом:

public class LowerCaseReplacement extends ReplacementTransformationMethod {
private static final char[] ORIG = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
        'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static final char[] REPS = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
private static LowerCaseReplacement singleton;

@Override
protected char[] getOriginal() {
    return ORIG;
}

@Override
protected char[] getReplacement() {
    return REPS;
}

public static LowerCaseReplacement getInstance() {
    if (singleton == null)
        singleton = new LowerCaseReplacement();
    return singleton;
}

}

и добавил эту xform в et ...как в et.setTransformationMethod (LowerCaseReplacement.getInstnace ()) ...

Это работает !!

Если у кого-то есть лучшее решение, пожалуйста, просветите!

0 голосов
/ 22 ноября 2010

Проблема в том, что при вызове метода вставки метод с измененным текстом вызывается снова. Это приводит к порочному кругу, поэтому переполнение стека. Вы можете избежать этого, не заменяя строку в правильном формате.

...