EditText中对本身修改的方法

此篇为复制内容

需要在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()));

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

    TextWatcher textWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            if (editable.toString().trim().length() > 0 && !editable.toString().trim().substring(0, 1).equals("0")) {
                jine = editable.toString().trim();
            } else {
                reward_zidingyi_edit.removeTextChangedListener(this);//先移除监听,再设置文本,否则会无限死循环
                reward_zidingyi_edit.setText("");
                reward_zidingyi_edit.addTextChangedListener(textWatcher);
                jine = "";
            }
        }
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值