【问题标题】:Removing TextChangedListener then re-adding it删除 TextChangedListener 然后重新添加它
【发布时间】:2011-07-18 06:21:25
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: android textwatcher


    【解决方案1】:

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

    这样的

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

    【讨论】:

    • 啊,完美..不敢相信我没想到这一点。谢谢
    【解决方案2】:

    跟随怎么样。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      相关资源
      最近更新 更多