您的位置:首页 > 其它

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

2016-07-26 21:54 483 查看
今天老大给我分配了实现类似支付宝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写文章,有何不足之处还望多多指点!非常感谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: