7

因此,我一直在尝试为 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 的问题吗?

提前致谢

4

2 回答 2

5

每次您将更新(例如通过调用 set text)您的 editText 时,都会调用 afterTextChanged,所以我认为您应该避免在每次进入 afterTextChanged 时调用 setText,并且只有在某些事情真正发生变化时才调用它。

像这样

if ( !myCurrencyString.equals(et.getText()))
{
    et.setText(myCurrencyString);
}
于 2011-07-18T07:44:29.893 回答
2

跟风怎么样。

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

        edtView.addTextChangedListener(textWatcherListener);
    }
}

我学到了什么:不要低估TextWatcher的力量:D :D

于 2017-07-19T12:14:58.177 回答