Android-виртуальная клавиатура - PullRequest
0 голосов
/ 15 ноября 2011

Я пытаюсь реализовать iPhone как авторизацию PIN-кода с 4 блоками EditText, как это:

iphone pin authorization

Я использую TextWatcher, чтобы проверить, было ли изменено поле, чтобы я мог переходить между блоками. Вот код:

@Override
public void afterTextChanged(Editable s) {
    if (del && index > 0) {
        pin[index - 1].requestFocus();
    }
    else if ( ! del && ind < 3) {
        pin[index + 1].requestFocus();
    }
}

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

    del = count != 0;
}

Все работает нормально, за исключением случаев, когда блок пуст и нажата DEL / BACKSPACE, я хочу вернуться к предыдущему блоку и очистить его значение. Вот где TextWatcher не работает, так как в пустом блоке не было сделано никаких изменений, ничего не происходит.

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

Кто-нибудь может подсказать, как я могу поймать событие DEL или каким-либо другим способом реализовать это?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Я нашел решение этой проблемы. Вероятно, это не лучшее решение, но оно работает для меня. Помимо TextWatcher я добавил InputFilter в блоки

@Override
public CharSequence filter(CharSequence source, int start, int end,
        Spanned dest, int dstart, int dend) {
    if ( end == 0 && ind > 0 && dest.length() == 0 ) {
        pin[ind - 1].requestFocus();
    }
    return null;
}

Я также думаю, что лучше перенести оставшуюся часть кода с TextWatcher на InputFilter

0 голосов
/ 15 ноября 2011

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

...