繁体   English   中英

不同设备上的不同正则表达式行为

[英]different regex behaviour on different devices

我在尝试检查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 ")); 
}

我正在与两种不同的Android手机进行比较:Asus Zenfone和Honor 5C。

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

荣誉5C :(预期行为)

在此处输入图片说明

华硕Zenfone :(行为错误)

在此处输入图片说明

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

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

如果任何子类想知道,则在更改文本时将调用此方法。 在文本中,从开始处开始的lengthAfter字符刚刚替换了具有lengthBefore长度的旧文本。

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

您是否尝试过在EditText上使用TextWatcher 例如:

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);
      }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM