6

我的应用程序使用基于 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 都会将焦点移至“下一个”视图。如果用户在最后一个上输入文本,则请求将发送到服务器。

这在我测试过的所有设备上都非常有效,除了三星 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 2013 年 11 月 16 日)
  • S3:三星 SGH-I747,Android 4.3,内部版本:JSS15J.I747UCUEMJB,内核:3.0.31-2024954 2013 年 10 月 31 日)
4

2 回答 2

3

快速猜测:尝试onTextChanged(CharSequence s, int start, int before, int count)使用TextWatcher.

如前所述,它可能会使三星设备更快地识别焦点开关,从而避免给您带来麻烦的延迟onTextChanged()afterTextChanged()

另外,尝试使用inputType您的属性EditText(例如将其设置为numbertextNoSuggestions)以进一步提高速度。

于 2014-02-14T19:27:47.450 回答
0

使用以下链接,并在其中使用 Thread in side on text changed listner

于 2014-02-17T14:21:20.583 回答