Разрешить только 1 символ в EditText и всегда перезаписывать, когда пользователь вводит его

Мне нужно создать EditText , который будет принимать только один символ и только символ (буква / альфа ). И если пользователь вводит другой символ, он должен заменить существующий (например, метод перезаписи ввода текста с 1 допустимым символом).

  1. Я знаю, как установить максимальную длину текста в свойствах. Но если я установил его до 1, то никакой другой символ не может быть вставлен, прежде чем пользователь удалит существующий. Но я хочу заменить существующий символ новым введенным один автоматически без ручного удаления. Как это сделать?

  2. Я знаю, как установить свойство, разрешающее только цифры в EditText , но я не могу понять, как разрешить только символы. Итак, второй вопрос: как разрешить только символы в EditText ?

В настоящее время я использую EditText с максимальным размером текста = 2 со следующим кодом:

final EditText editLetter = (EditText)findViewById(R.id.editHouseLetter); 
editLetter.addTextChangedListener(new TextWatcher() {

    public void afterTextChanged(Editable s) {
        if (s!=null && s.length()>1){
            editLetter.setText(s.subSequence(1, s.length()));
            editLetter.setSelection(1);
        }
    }

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

    }

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

    }
});

Дело в том, что когда пользователь вводит второй символ, первый должен быть удален. Установка размера текста на 2 позволяет пользователю вводить еще один символ после того, как он уже был введен.

Я действительно не понимаю, как это работает, но это так :). И, кроме того, мне пришлось навести курсор в EditText на последнюю позицию, потому что он всегда переходит в начало, что делает невозможным ввод вообще ничего. Не понимаю, почему так.

Основная суть этого решения состоит в том, что оно имеет размер 2 символа EditText , но я хочу, чтобы он был размером 1 символ. И это позволяет вводить что угодно, кроме букв (символы / альфа), и мне нужны только символы.

Воспользовавшись советом, предоставленным функцией sgarman и Character.isLetter () , Метод afterTextChanged теперь выглядит следующим образом:

public void afterTextChanged(Editable s) {
    int iLen=s.length();
    if (iLen>0 && !Character.isLetter((s.charAt(iLen-1)))){
        s.delete(iLen-1, iLen);
        return;
    } 
    if (iLen>1){
        s.delete(0, 1);
    } 
}

Я обнаружил, что использование Selection.setSelection в этом случае не требуется. Теперь в нем есть фильтр, позволяющий вводить только буквы. Это почти тот ответ, который я хочу. Осталось только одно: как сделать то же самое с размером в 1 символ EditText ?

7
задан Andrew T. 21 September 2015 в 08:15
поделиться