[java] Проверка EditText с помощью TextWatcher



Answers

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

Question

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

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 на отфильтрованную строку, мое приложение зависает. И угадайте, что я нахожу в отладке?

ERROR / AndroidRuntime (2454): java.lang.Error = D

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

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




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




Links