在工作过程中,各种文本框的输入有各种特殊需求,如输入整数、字母等等需求。现公司业务需求,要求某文本输入框,只能输入整数,并且不能出现以“010”,数字出现以0开头的情形。
经过查询文档,发现EditText可以通过addTextChangedListener方法,添加文本变化的监听器。我们可以通过该监听器对以0开头的情形进行处理。
于是有如下代码:
editText = (EditText) findViewById(R.id.editText1);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
//将字符串转换成整形,然后在转换成字符型。完成“010”--->"10"的转换
Integer integer = Integer.valueOf(s.toString());
editText.setText(integer.toString());
}
});
运行程序,会有java.lang.StackOverflowError。
经过分析知道,在afterTextChanged方法中,使用setText()方法,会重新触发监听器,并不断的进行递归,最后程序崩溃。只要原因后,我们就有如下解决办法。
editText = (EditText) findViewById(R.id.editText1);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
//在afterTextChanged中,调用setText()方法会循环递归触发监听器,必须合理退出递归,不然会产生异常
if (s.length() > 1 && s.charAt(0) == '0') {
Integer integer = Integer.valueOf(s.toString());
editText.setText(integer.toString());
}
}
});