В моем приложении используется вход на основе 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 г.)