Мягкая клавиатура Samsung теряет нажатия клавиш после смены фокуса

В моем приложении используется вход на основе PIN-кода. У меня есть четыре представления EditText подряд, и я устанавливаю отдельный экземпляр следующего TextWatcher для каждого из них:

private class PinDigitWatcher implements TextWatcher {

    private final EditText digit;

    public PinDigitWatcher(EditText digit) {
        this.digit = digit;
    }

    @Override
    public void afterTextChanged(Editable s) {
        if (s.length() <= 0)
            return;
        switch (digit.getId()) {
        case R.id.pin_digit_a:
            mPinDigitB.setFocusableInTouchMode(true);
            mPinDigitB.requestFocus();
            mPinDigitA.setFocusable(false);
            break;
        case R.id.pin_digit_b:
            mPinDigitC.setFocusableInTouchMode(true);
            mPinDigitC.requestFocus();
            mPinDigitB.setFocusable(false);
            break;
        case R.id.pin_digit_c:
            mPinDigitD.setFocusableInTouchMode(true);
            mPinDigitD.requestFocus();
            mPinDigitC.setFocusable(false);
            break;
        case R.id.pin_digit_d:
            mPinDigitD.setFocusable(false);
            onSubmitPin();
            break;
        }
    }

    @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, TextWatcher перемещает фокус на «следующее». Если пользователь вводит текст на последнем, запрос отправляется на сервер.

Это прекрасно работает на всех протестированных мною устройствах, кроме Samsung S3 и S4. На этих устройствах есть полсекундная задержка после смены фокуса, когда пользователь нажимает клавишу на программной клавиатуре. В результате, если пользователь коснется первого EditText, чтобы вызвать клавиатуру, а затем быстро нажмет цифру четыре раза подряд (например, если его PIN-код «1111»), первая цифра будет зарегистрирована, фокус изменится, но остальные три цифры упавший.

Я зашел в «Настройки клавиатуры Samsung» и отключил интеллектуальный ввод текста, автоматическую замену, автоматическое использование заглавных букв, автоматический интервал и автоматическую пунктуацию. Казалось, это не имеет значения.

Оба моих S3 и S4 работают под управлением Android 4.3, поэтому, к сожалению, я не могу сказать, является ли это «проблемой Samsung» или «проблемой Android 4.3». Я убедился, что этого не происходит на Galaxy Nexus с версией 4.2.2 и Nexus 4 с версией 4.4.2.

Любые мысли по обходному пути?

РЕДАКТИРОВАТЬ:

Я воссоздал проблему на Samsung S4 под управлением Android 4.2.2, так что это похоже на проблему Samsung, а не конкретно на Android 4.3. Вот рабочий проект, который иллюстрирует поведение:

https://drive.google.com/file/d/0B6DvDY2BvxUTRUxZNE5DNXJJM2c

Нажмите на первый значок EditText, чтобы открыть виртуальную клавиатуру, затем нажмите любую цифровую клавишу четыре раза подряд. Только первое касание будет зарегистрировано. По завершении четырех нажатий фокус будет на втором EditText (слева).

РЕДАКТИРОВАТЬ:

Дополнительная информация о двух телефонах, на которых обнаружена проблема:

  • S4: Samsung SGH-I337, Android 4.3, сборка: JSS15J.I337UCUEMK2, ядро: 3.4.0-1921628, 16 ноября 2013 г.)
  • S3: Samsung SGH-I747, Android 4.3, сборка: JSS15J.I747UCUEMJB, ядро: 3.0.31-2024954, 31 октября 2013 г.)

comment
Не могу воспроизвести проблему на GT-I9506 с Android 4.3; Клавиатура Samsung (версия 4.0 указана на экране информации о приложении), язык ввода: английский (Великобритания).   -  person ozbek    schedule 11.02.2014
comment
Попробуйте нажать один номер как можно быстрее. Я сделал четыре нажатия на цифру 1 примерно за 1 секунду, и только два из них попали в EditTexts. Я думаю, что зависание связано с программной клавиатурой Samsung. Он делает что-то на тапе, из-за чего он игнорирует дополнительные тапы, пока не закончит то, что делает. Я отредактировал вопрос, чтобы включить более подробную информацию о телефонах, на которых я вижу проблему.   -  person jph    schedule 11.02.2014
comment
Есть новости по этому поводу? Такая же проблема в течение длительного времени на устройствах Samsung. Как только я подключаю TextWatcher, ввод становится очень медленным.   -  person Mikhail    schedule 25.09.2017


Ответы (2)


Быстрая догадка: попробуйте выполнить проверку методом onTextChanged(CharSequence s, int start, int before, int count) метода TextWatcher.

Поскольку onTextChanged() вызывается перед afterTextChanged(), это может привести к тому, что устройства Samsung быстрее распознают переключатель фокуса и, следовательно, избегают задержки, которая вызывает ваши проблемы.

Кроме того, попробуйте поиграть с атрибутом inputType вашего EditText (например, установите его на number или textNoSuggestions), чтобы еще больше повысить скорость.

person saschoar    schedule 14.02.2014
comment
Хорошие мысли. Попробую, когда вернусь в офис во вторник. - person jph; 15.02.2014
comment
Поэтому я попытался поставить галочку перед TextChanged(). Без изменений. Затем я попытался изменить тип ввода на numberPassword; без изменений. Раньше inputType был числом, а пароль был истинным. Думаю, я спишу это на глупость со стороны Samsung и больше не буду об этом беспокоиться. Функционал ввода PIN-кода по-прежнему работает, задержка просто раздражает. - person jph; 17.02.2014

Используйте следующую ссылку и в которой используйте Thread внутри текстового измененного списка

person Digvesh Patel    schedule 17.02.2014