Разрешить AndroidX EditTextPreference принимать только буквы - PullRequest
0 голосов
/ 24 января 2020

У меня есть EditTextPreference с фильтром для ограничения его размера, например:

pref.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
            @Override
            public void onBindEditText(@NonNull EditText editText) {
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(10)});
            }
        });

Я также хочу ограничить его приемом только букв (не только a-zA-Z, так как приложение принимает более одного языка). Как я могу go сделать это?

Я уже пробовал много фильтров, в том числе все те, которые предложены в этих вопросах и аналогичные:

В поле EditText принимаются только буквы и пробелы в Android

Edittext допускает только буквы (программно)

С фильтрами, подобными тем, когда вводится число, а затем буква, У меня возникают такие проблемы, как:
- весь текст исчезает
- весь текст дублируется
- дублируются последние несколько символов

Я также попытался изменить XML, добавив и android:digits, но независимо от того, что это вообще не ограничивает ввод.
Каждые inputType, которые я пытался до сих пор, не ограничивают клавиатуру только буквами.

РЕДАКТИРОВАТЬ: Я понял, ответ ниже.

1 Ответ

0 голосов
/ 24 января 2020

Я просто добавил TextWatcher в EditText и заменил текст регулярным выражением, например так:

editText.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    }

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        editText.removeTextChangedListener(this);
                        String replaced = s.toString().replaceAll("[^[:alpha:] ]", "");
                        editText.setText(replaced);
                        editText.setSelection(replaced.length());
                        editText.addTextChangedListener(this);
                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                });

Это позволяет добавлять буквы, но когда набирается что-то еще, это не так появляются и нигде не сохраняются. Метод setSelection() предназначен для помещения курсора в конец строки, в противном случае он сбрасывается в начало.

...