三星软键盘在焦点改变后丢失按键输入

7

我的应用使用基于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会将焦点移动到“下一个”EditText。如果用户在最后一个上输入文本,则将请求发送到服务器。
这在我测试过的所有设备上都很好,除了三星S3和S4。在这些设备上,在用户点击软键盘上的按键后,焦点更改后会有半秒的延迟。结果是,如果用户点击第一个EditText以弹出键盘,然后连续四次快速点击数字(例如,如果他的PIN为“ 1111”),则第一个数字被注册,焦点更改,但其他三个数字被丢弃。
我进入“三星键盘设置”并禁用了预测文本、自动替换、自动大写、自动间隔和自动标点符号。似乎没有什么区别。
我的S3和S4都运行Android 4.3,因此不幸的是,我无法确定这是“三星问题”还是“Android 4.3问题”。我已经验证它不会发生在运行4.2.2的Galaxy Nexus和运行4.4.2的Nexus 4上。
有任何解决方法的想法吗?
编辑:

我在运行 Android 4.2.2 的三星 S4 上重新创建了这个问题,因此它似乎是一个三星的问题,而不是特定于 Android 4.3。以下是一个演示该行为的工作项目:

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

点击第一个EditText以调出软键盘,然后快速连续敲击任意数字键四次。只有第一次敲击会被注册。在四次敲击结束后,焦点将在从左边数的第二个EditText上。
编辑:
以下是两台出现问题的手机的更多信息:
  • S4: 三星SGH-I337,Android 4.3,版本:JSS15J.I337UCUEMK2, 内核:3.4.0-1921628 Nov 16 2013)
  • S3: 三星SGH-I747,Android 4.3,版本:JSS15J.I747UCUEMJB, 内核:3.0.31-2024954 Oct 31 2013)

我无法在安装有Android 4.3的GT-I9506上重现该问题;使用的是三星键盘(应用信息屏幕中显示版本为4.0),输入语言为英语(英国)。 - ozbek
尝试尽可能快地轻敲单个数字。我在大约1秒钟内对数字“1”进行了四次轻敲,但只有两次成功输入到EditText中。我认为问题出在三星软键盘上。它在轻敲时做了一些导致它忽略其他轻敲直到完成操作的事情。我已经编辑了问题,以包括我遇到问题的手机的更详细信息。 - jph
这个问题有任何更新吗?在三星设备上已经遇到了很长一段时间了。一旦我连接TextWatcher,输入就变得非常缓慢。 - Mikhail
2个回答

3
一个快速的猜测:尝试在TextWatcheronTextChanged(CharSequence s, int start, int before, int count)方法中检查您的内容。
由于onTextChanged()会在afterTextChanged()之前调用,因此它可能会导致三星设备更快地识别焦点切换,从而避免造成麻烦的延迟。
此外,尝试在您的EditTextinputType属性上进行玩耍(例如将其设置为numbertextNoSuggestions),以进一步提高速度。

好的想法。周二回到办公室时会尝试。 - jph
所以我尝试在beforeTextChanged()中放置检查。没有变化。然后我尝试将输入类型更改为“numberPassword”;没有变化。之前的inputType是“number”,而“password”是“true”。我想我会把这个归咎于三星的失误,不再担心它了。PIN输入功能仍然可用,只是有点烦人的延迟。 - jph

0

请使用以下链接,并在其中使用线程来监听文本更改


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接