您的位置:首页 > 其它

使用TextWatcher监听EditText的文本变化之后动态改变EditText里面的内容

2012-12-20 17:53 399 查看
今天碰到一个这样的问题:使用TextWatcher对EditText进行监听,当EditText中值为某一特定内容时,将EditText中的值设为我们需要的那个值。一开始就是简单的在EditText中使用setText(...)来实现,结果出现栈溢出的异常。这里提供一个解决方案:当判断条件满足时,在afterTextChanged()方法中将TextWatcher移除掉,然后设置EditText的值,接着把TextWatcher重新设置进去。就是这么简单,这里我们判断如果EditText中的值为111,就将EditText的值设置为11111new。先看效果图,再看代码。

效果图:



代码:

EditText editText;
MyTextWathcer myTextWathcer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText) findViewById(R.id.editText);
myTextWathcer = new MyTextWathcer();
editText.addTextChangedListener(myTextWathcer);
}

private class MyTextWathcer implements TextWatcher{

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {

}

@Override
public void afterTextChanged(Editable s) {
int i = 0;
try {
i = Integer.valueOf(s.toString());
} catch (Exception e) {
e.printStackTrace();
}
if(i == 111){
editText.removeTextChangedListener(this);
setMyText();
}
}
}

private void setMyText(){
editText.setText("11111new");
editText.addTextChangedListener(myTextWathcer);
}
可能很多童鞋会奇怪,为什么在自己类的方法中将自己移除不会出错?我们去TextView类的removeTextChangedListener()方法中看一下大概就会明白了。该方法如下:

/**
* Removes the specified TextWatcher from the list of those whose
* methods are called
* whenever this TextView's text changes.
*/
public void removeTextChangedListener(TextWatcher watcher) {
if (mListeners != null) {
int i = mListeners.indexOf(watcher);

if (i >= 0) {
mListeners.remove(i);
}
}
}


文档已经说的很清楚了,该方法仅仅是将当前的TextWatcher从集合中移除。我们可以理解成该TextWatcher对象暂时未被回收,所以在不进行耗时操作的情况下,该解决方案是可行的,不知道还有没有更好的方式,如果某位朋友有更好的方式,可以拿出来一起分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: