Разрешить только 1 символ в EditText и всегда перезаписывать при вводе пользователем - PullRequest
7 голосов
/ 06 апреля 2011

Мне нужно сделать 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 на последнюю позицию, потому что он всегда идет к началу, что делает невозможным вообще вводить что-либо. Не понимаю, почему это так.

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

Используя советы 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 не требуется в этом случае. Теперь он имеет фильтр, позволяющий вводить только буквы. Это почти ответ, который я хочу. Осталось только одно - как сделать то же самое с размером символа 10 EditText?

.

Ответы [ 3 ]

11 голосов
/ 08 июля 2013

Вы можете добавить эту единственную строку в свой XML-файл макета, и Android сделает все за вас

android:maxLength="1"

наверняка вы должны добавить его в качестве свойства к элементу editText, например

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:maxLength="1" >

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

И я не должен забывать поблагодарить владельца этого блога , от которого я процитировал ответ!

3 голосов
/ 06 апреля 2011

Попробуйте:

s.delete(0, 1);
Selection.setSelection(s, s.length());
2 голосов
/ 25 июня 2017

Я хотел сделать то же самое, и я использовал ваш код в afterTextChanged (Editable s), а также установил один фильтр для editText следующим образом.

editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(2)});

Он работал так, как мы хотели.

...