Как отловить событие, когда заполнен EditText и нажата новая клавиша? - PullRequest
0 голосов
/ 04 октября 2018
<EditText
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:imeOptions="actionNext"
    android:inputType="textNoSuggestions|textCapCharacters"
    android:maxLength="3"
    android:hint="ABC"
    />

Также есть еще один EditText, который должен быть сфокусирован, когда все 3 символа заполнены в name.

name.addTextChangedListener(object: TextWatcher {
    override fun afterTextChanged(s: Editable?) {
        // Move to surname when all three symbols are entered.
        if (name.text.toString().length == 3) {
            surname.requestFocus()
        }
    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
})

. Он работает правильно, когда мы вводим 1, 2 и 3 символа.Но когда мы выбираем последнюю позицию в name, нажимаем новую букву на клавиатуре, ничего не происходит.Я пытался поймать нажатие клавиши с помощью

name.setOnKeyListener { v, keyCode, event ->
    if (name.text.getText().length == 3) {
        surname.requestFocus()
    }
    false
}

, но событие не происходит.Как переместить фокус?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Изменить maxLength на 4

android:maxLength="4"

In afterTextChanged:

 override fun afterTextChanged(s: Editable?) {
    // Move to surname when all three symbols are entered.
    if (name.isFocused() && name.text.toString().length > 3) {
        surname.requestFocus();
        name.setText(s.toString().substring(0,3));

    }
}
0 голосов
/ 04 октября 2018

Согласно ответу @nupadhyaya, я так и сделал.

1) Удалено android:maxLength="3" (или можно установить android:maxLength="4").

2) Добавлено событие для новых символов:

name.addTextChangedListener(object: TextWatcher {
    override fun afterTextChanged(s: Editable?) {
        val text = name.text.toString()
        if (text.length >= 3) {
            surname.requestFocus()
            if (text.length > 3) {
                // Remove symbols after third.
                name.setText(text.substring(0, 3))
            }
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
    })
}

3) Добавлено событие для ввода Backspace фамилии:

surname.setOnKeyListener { _, keyCode, _ ->
    if (keyCode == KeyEvent.KEYCODE_DEL && surname.text.toString().isEmpty()) {
        // Move to the last symbol of name.
        name.requestFocus()
        name.setSelection(name.text.toString().length)
    }
    false
}
0 голосов
/ 04 октября 2018

Добавьте проверку в beforeTextChanged (), если последовательность символов уже имеет 3 символа, если это так, то запросите фокус на фамилии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...