两个EditText互相监听发生栈溢出

        今天老大给我分配了实现类似支付宝APP里面汇率换算的界面和业务逻辑功能。于是我就操作了一遍支付宝汇率换算的功能,发现界面非常简单,但是业务逻辑有点复杂,用户是可以随意切换任意一个EditText进行输入金额,而且两个EditText是互相监听的,我就试着自己操作了一遍。

        首先就是关于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写文章,有何不足之处还望多多指点!非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值