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

  今天碰到一个这样的问题:使用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对象暂时未被回收,所以在不进行耗时操作的情况下,该解决方案是可行的,不知道还有没有更好的方式,如果某位朋友有更好的方式,可以拿出来一起分享。


  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值