使用EditText出现java.lang.StackOverflowError报错
2016-10-13 11:19
211 查看
最近项目中有个在EditText中输入子网掩码(xxx.xxx.xxx.xxx)形式的需求,只需
手动填入数字,自动添加”.”进去。于是想到了EditText的addTextChangedListener,
不过在editText.setText()时就碰到了问题,报了java.lang.StackOverflowError错误。
由于每次EditText有变动就会触发onTextChanged(),就会一直递归 执行editText.setText();
造成当前线程栈满了,就会使程序崩溃。
我们只要增加条件去中断这种递归即可解决问题,不满足条件就不执行。
当输入1234时,Log日志为
sb.toString()的值是123.4,而s.toString()的值是1234,两个值不同才会执行setText()方法。
总之,我们只需要提供一个递归出口就能解决问题。
手动填入数字,自动添加”.”进去。于是想到了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()方法。
总之,我们只需要提供一个递归出口就能解决问题。
相关文章推荐
- 使用组件来保护你的ASP代码
- SCI软件使用方法总结-定位测量篇
- IP 伪装简易使用说明
- 源码推荐:一个使用C#绘制图形引擎的Framework
- Win32汇编教程六 工具栏和状态栏的使用
- Win32汇编教程五 菜单和加速键的使用
- Win32汇编教程三 一个简单的对话框 --- 兼谈资源文件的使用
- 使用ActiveX控件开发网页常见的问题
- 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图 (2)
- 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图
- 手册中关于怎样使用TQuery 的误导
- 使用ASP和Word进行服务器端拼写检查
- 单独使用CRecordSet
- 在 Web 页上使用条件数值格式
- 关于PHP与Sybase数据库的连接与使用
- 使用ASP常见问题解答
- [导入]Guru of the Week:#41 使用标准库
- 如何使用ASP进行打印操作
- VB中Winsock控制的UDP协议的使用
- FUNCky 的使用