EditText afterTextChanged 中setText使输入法切换回字母输入模式问题

背景:

 需要在EditText中对输入的身份证号进行分段显示,例如:123456789012345678 显示为123456 7890 1234 5678,我的做法是

   
  etIDCard.addTextChangedListener(new IDCardNumberWatcher());  //身份证输入框,没有做数字限制,因为身份证号有可能存在字母


  class IDCardNumberWatcher implements TextWatcher {  
      
              
            public void beforeTextChanged(CharSequence s, int start, int count,  
                    int after) {  
                
            }  
      
            public void onTextChanged(CharSequence s, int start, int before,  
                    int count) {  
              
            }  
      
            public void afterTextChanged(Editable editable) {  
               edIDCard.removeTextChangedListener(this);//先移除监听,再设置文本,否则会无限死循环
               edIDCard.setText(getFormatIDCard(editable.toString()));//对输入框文本进行分段显示
               etIDCard.<span style="color:black;">addTextChangedListener(this); //再次添加监听,监听用户输入动作</span>
  } } 

  /**
  *对文本进行分段显示,例如:123456789012345678 显示为123456 7890 1234 5678
  */
  private String getFormatIDCard(String str){
    String result = null;
    //处理过程省略
    return result;
  }

 

上面的代码看似完美,可以实现想要的效果,呵呵哒,这只是背景介绍。下面看问题。

问题:

如果手机默认的输入法是谷歌输入法(被老大坑的前奏,其他输入法没这事啊),那么用户体验是这样的:

因为没有做数字限制,那么该输入框可以输入数字、字母、中文等等,也即键盘输入法可以切换到数字盘和字母盘或其他,那么如果对EditText做了以上代码监听,当谷歌键盘用户切换到数字盘输入一个数字后,哦豁,键盘模式自动由数字盘切换回默认的字母盘。

一句话:每次在数字盘输入一个数字,键盘就自动切换到字母盘。

这不行啊,改,改改改!

原因:

经过一句一句的注释后运行测试,发现问题出在afterTextChanged里面的setText,每次setText后,键盘布局就发生改变

ok,不能setText来达到目的,那么想个其他方式吧:

解决:

将afterTextChanged中的setText语句修改为:

editable.replace(0,editable.length,getFormatIDCard(editable.toString()));

原理:

暂时还不知,有知情人士,敬请告知,谢谢~

题外话:

1.身份证输入框EditText可以在xml中声明:android:digits="0123456789xX",直接限定输入的字符

2.在TextWatcher 中如果要对EditText进行setText,那么切记要先removeTextChangedListener再setText,然后再addTextChangedListener,否则会在setText时出现无限死循环,导致StackOverFlow,啦啦啦~

3.身份证的一个正则表达式:^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值