删除TextChangedListener然后重新添加它

时间:2011-07-18 06:21:25

标签: android textwatcher

所以我一直在尝试为Android实现TextWatcher并遇到一些问题,TextChangedListener被多次调用或进入无限循环,因为我想将EditText小部件中的文本转换为货币格式化的字符串

我为解决这个问题所做的是创建我自己的自定义TextWatcher然后在afterTextChanged事件中做了类似下面的事情

public class CurrencyTextWatcher implements TextWatcher {
    private EditText et;

    public CurrencyTextWatcher(EditText editText) {
        et = editText;
    }

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

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

    public void afterTextChanged(Editable s) {
        et.removeTextChangedListener(this);
        et.setText(myCurrencyString);
        et.addTextChangedListener(this);
    }
}

所以我的问题是,有更好的方法吗?我希望有一个EditText小部件来保存编辑所在的位置以及生成的格式化字符串。

实际上是否还有其他问题需要删除,然后添加像这样的TextChangedListener?

提前致谢

2 个答案:

答案 0 :(得分:3)

每当你更新(通过调用set text)你的editText时,都会调用afterTextChanged,所以我认为你应该在每次进入afterTextChanged时都不要调用setText,只有在真正改变时才调用它。

像这样

if ( !myCurrencyString.equals(et.getText()))
{
    et.setText(myCurrencyString);
}

答案 1 :(得分:0)

如何关注。

private void resetAddTagField() {
    if (edtView != null && textWatcherListener != null) {
        edtView.removeTextChangedListener(textWatcherListener);
        edtView.setText(DEFAULT_TEXT);    

        edtView.addTextChangedListener(textWatcherListener);
    }
}

我学到的东西:不要低估 TextWatcher 的力量:D:D