1

当我尝试检查时遇到一个奇怪的错误EditText(我希望文本是 IBAN,例如FR76 2894 2894 2894 289),所以我正在这样做(覆盖我的编辑文本onTextChanged):

// format with IBAN regex
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
    editText.setText(editText.getText().toString().replaceAll(" ", "")
            .toUpperCase().replaceAll("[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}", "$0 ")); 
}

我正在与两款不同的安卓手机进行比较:华硕 Zenfone 和荣耀 5C。

两种设备在输入第一个字符时具有相同的行为(仅当它是字母时才有效)。但是,当我输入第二个字母时(文本应该FR在此之后):

荣誉 5C:(预期行为)

在此处输入图像描述

华硕 Zenfone:(错误行为)

在此处输入图像描述

任何想法?谢谢你的帮助。

4

1 回答 1

0

正如您在文档setText中看到的那样,从以下位置调用似乎是个坏主意onTextChanged

当文本改变时调用这个方法,以防任何子类想知道。在文本中,从 start 开始的 lengthAfter 字符刚刚替换了长度为 lengthBefore 的旧文本。

尝试从此回调中更改文本是错误的。

您是否尝试过使用TextWatcherEditText?例如:

editText.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {

      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {

      }

      @Override
      public void afterTextChanged(Editable s) {
        // This is only a sample code trying to reproduce your current behavior. 
        // I did not test it.
        String iban = s.toString().toUpperCase().replaceAll(" ", "");
        String compactIban = iban.replaceAll("[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}", "$0 ");
        s.replace(0, s.length(), compactIban);
      }
    });
于 2017-12-08T15:12:36.000 回答