EditText afterTextChanged 中 使用setText输入法异常问题

QQ群:372135639

需要在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语句修改为:

[java] view plain copy print?
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))$
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值