此篇为复制内容
需要在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 = "";
}
}
};