两个EditText互相监听发生栈溢出
2016-07-26 21:54
483 查看
今天老大给我分配了实现类似支付宝APP里面汇率换算的界面和业务逻辑功能。于是我就操作了一遍支付宝汇率换算的功能,发现界面非常简单,但是业务逻辑有点复杂,用户是可以随意切换任意一个EditText进行输入金额,而且两个EditText是互相监听的,我就试着自己操作了一遍。
首先就是关于EditText的监听,对单个editext的监听比较简单,定义一个监听类,然后加上监听事件即可:
但是比较头疼的是两个editext的互相监听,下面是我折腾出来的代码,可能比较复杂而且不灵活,但是确实可以实现互相监听的功能,步骤如下:
1.先定义两个控件
2.设置只能输入数字和小数点
3.实现监听的添加和移除,保证不会栈溢出
4.最后一步在onCreate中添加监听即可
et1.addTextChangedListener(watcher1);
et2.addTextChangedListener(watcher2);
哈哈!这就写完了呢!这是本人第一次在csdn写文章,有何不足之处还望多多指点!非常感谢!
首先就是关于EditText的监听,对单个editext的监听比较简单,定义一个监听类,然后加上监听事件即可:
class EditChangedListener implements TextWatcher { private CharSequence temp;//监听前的文本 private int editStart;//光标开始位置 private int editEnd;//光标结束位置 private final int charMaxNum = 10; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (DEBUG) Log.i(TAG, "输入文本之前的状态"); temp = s; } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (DEBUG) Log.i(TAG, "输入文字中的状态,count是一次性输入字符数"); mTvAvailableCharNum.setText("还能输入" + (charMaxNum - s.length()) + "字符"); } @Override public void afterTextChanged(Editable s) { if (DEBUG) Log.i(TAG, "输入文字后的状态"); /** 得到光标开始和结束位置 ,超过最大数后记录刚超出的数字索引进行控制 */ editStart = mEditTextMsg.getSelectionStart(); editEnd = mEditTextMsg.getSelectionEnd(); if (temp.length() > charMaxNum) { Toast.makeText(getApplicationContext(), "你输入的字数已经超过了限制!", Toast.LENGTH_LONG).show(); s.delete(editStart - 1, editEnd); int tempSelection = editStart; mEditTextMsg.setText(s); mEditTextMsg.setSelection(tempSelection); } } };
加上监听事件:mEditTextMsg.addTextChangedListener(new EditChangedListener());
但是比较头疼的是两个editext的互相监听,下面是我折腾出来的代码,可能比较复杂而且不灵活,但是确实可以实现互相监听的功能,步骤如下:
1.先定义两个控件
EditText et1 = (EditText) findViewById(R.id.editText1); EditText et2 = (EditText) findViewById(R.id.editText2);
2.设置只能输入数字和小数点
et1.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); et2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
3.实现监听的添加和移除,保证不会栈溢出
private TextWatcher1 watcher1 = new TextWatcher1(); private TextWatcher2 watcher2 = new TextWatcher2(); private class TextWatcher1 implements TextWatcher { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { et2.removeTextChangedListener(watcher2); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 0) { delete1.setVisibility(View.VISIBLE); et2.setText(et1.getText().toString()); } else { delete1.setVisibility(View.INVISIBLE); et2.setText(0+""); } } @Override public void afterTextChanged(Editable s) { et2.addTextChangedListener(watcher2); } } private class TextWatcher2 implements TextWatcher { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { et1.removeTextChangedListener(watcher1); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 0) { delete2.setVisibility(View.VISIBLE); et1.setText(et2.getText().toString()); } else { delete2.setVisibility(View.INVISIBLE); et1.setText(0+""); } } @Override public void afterTextChanged(Editable s) { et1.addTextChangedListener(watcher1); } }
4.最后一步在onCreate中添加监听即可
et1.addTextChangedListener(watcher1);
et2.addTextChangedListener(watcher2);
哈哈!这就写完了呢!这是本人第一次在csdn写文章,有何不足之处还望多多指点!非常感谢!
相关文章推荐
- Validate Binary Search Tree
- 在JavaScript中自定义对象
- Android使用SVG实现今日头条下拉刷新动画
- linux基础2
- malloc原理和内存碎片(1)
- 【NOI1999】poj1191 棋盘分割
- Java线程的休眠
- Linux下的几种实用软件安装方法
- 【c++】初步探索c++对象模型
- 相机姿态估计(二)--单目POSIT算法
- IP地址与子网掩码
- ESXi 主机关闭默认https的欢迎页面
- select函数详解及其应用
- pthread第一次使用
- 基于Heros的过程间数据流分析的相关API
- leetcode Combination Sum I/II/III/IV
- 聪哥的壁纸
- JAVA项目一:图形化界面计算器
- 背包相关问题
- iOS实用技能之同一个String不同颜色的字