您的位置:首页 > 编程语言 > Java开发

使用EditText出现java.lang.StackOverflowError报错

2016-10-13 11:19 211 查看
最近项目中有个在EditText中输入子网掩码(xxx.xxx.xxx.xxx)形式的需求,只需

手动填入数字,自动添加”.”进去。于是想到了EditText的addTextChangedListener,

不过在editText.setText()时就碰到了问题,报了java.lang.StackOverflowError错误。

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
StringBuilder sb = new StringBuilder();//111.222.333.444
if (s == null || s.length() == 0) return;
for (int i = 0; i < s.length(); i++) {
if (i != 3 && i != 7 && i != 11 && s.charAt(i) == '.') {
continue;
} else {
sb.append(s.charAt(i));
if ((sb.length() == 4 || sb.length() == 8 || sb.length() == 12) && sb.charAt(sb.length() - 1) != '.') {
sb.insert(sb.length() - 1, ".");
}
}
}
editText.setText(sb.toString()); // 此处原因报错
}


由于每次EditText有变动就会触发onTextChanged(),就会一直递归 执行editText.setText();

造成当前线程栈满了,就会使程序崩溃。

我们只要增加条件去中断这种递归即可解决问题,不满足条件就不执行。

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
StringBuilder sb = new StringBuilder();//111.222.333.444
if (s == null || s.length() == 0) return;
for (int i = 0; i < s.length(); i++) {
if (i != 3 && i != 7 && i != 11 && s.charAt(i) == '.') {
continue;
} else {
sb.append(s.charAt(i));
if ((sb.length() == 4 || sb.length() == 8 || sb.length() == 12) && sb.charAt(sb.length() - 1) != '.') {
sb.insert(sb.length() - 1, ".");
}
}
}
if (!sb.toString().equals(s.toString())) { //增加条件
editText.setText(sb.toString());
Log.d("Position", start + "/" + before + "/" + count + "/" + sb.toString() + "/" + s.toString());
}
}


当输入1234时,Log日志为

D/Position: 0/3/4/123.4/1234


sb.toString()的值是123.4,而s.toString()的值是1234,两个值不同才会执行setText()方法。

总之,我们只需要提供一个递归出口就能解决问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EditText StackOverf