添加 TextChanged 实现后清除 EditText 文本

Posted

技术标签:

【中文标题】添加 TextChanged 实现后清除 EditText 文本【英文标题】:Clear EditText text after adding onTextChanged implemenation 【发布时间】:2011-04-06 13:45:43 【问题描述】:

我正在向 EditText 字段添加一个侦听器,以便将数字实时格式化为货币。

        loanText.addTextChangedListener(new TextWatcher() 
        private String current = "";
        public void onTextChanged(CharSequence s, int start, int before, int count) 
            if(!s.toString().equals(current))
               String cleanString = s.toString().replaceAll("[$,.]", "");

               double parsed = Double.parseDouble(cleanString);
               String formated = NumberFormat.getCurrencyInstance().format((parsed/100));

               current = formated;
               loanText.setText(formated);
               loanText.setSelection(formated.length());
            
        
        public void afterTextChanged(Editable s) 
            // TODO Auto-generated method stub

        
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) 
            // TODO Auto-generated method stub

        
    );

但是,当我尝试清除 EditView 字段时,我的应用程序会崩溃。此外,退格键不再起作用。

【问题讨论】:

你能发布 logcat 的输出吗?我很好奇你得到的错误。由于无限循环,它可能是 NumberFormatError 或(不太可能?)ANR。 尝试删除当前字符串并使用 if(s.toString().length() != 0) 请看这里:***.com/a/67753559/12272687 【参考方案1】:

问题是您的TextWatcher 看到您正在“清除”文本,因此向其回调方法(afterTextChangedbeforeTextChanged 等)发送请求。

我所做的只是删除TextWatcher,清除文本,然后将TextWatcherback 添加到EditText。这样一来,我的EditText 更改就不会被监听了。

您可能必须保留TextWatcher 的实例,而不是像您所做的那样内联它。这样你就不必每次想清除EditText时都创建一个

    loanText.removeTextChangedListener(yourTextWatcherObject); loanText.setText(""); loanText.addTextChangedListener(yourTextWatcherObject);

【讨论】:

我建议使用布尔变量来控制监听器是否应该做任何事情。 它对我不起作用是否有示例代码或其他解决方案谢谢【参考方案2】:

尝试使用 afterTextChanged 反而。我和另一个也有很多问题。

【讨论】:

【参考方案3】:

我发现这门课对我很有帮助: http://www.java2s.com/Code/android/UI/ConvertinputvaluetoCurrencyinTextWatcher.htm

希望这会为你们节省一些时间。

【讨论】:

【参考方案4】:
public class MainActivity extends Activity 
EditText et;
TextWatcher tw;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et=(EditText) findViewById(R.id.et);

     tw=new 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) 
            et.removeTextChangedListener(tw);
            et.setText(Math.random()+"");//add your logic here 
            et.addTextChangedListener(tw);
        ;
        et.addTextChangedListener(tw);
   

这是一个简单的解决方案。

【讨论】:

【参考方案5】:

可以如下检查onTextChanged中的Text是否为空,如果为空则什么都不做

s.toString().isEmpty()

public void onTextChanged(CharSequence s, int start, int before, int count) 
        if(!s.toString().equals(current) && !s.toString().isEmpty())
           String cleanString = s.toString().replaceAll("[$,.]", "");

           double parsed = Double.parseDouble(cleanString);
           String formated = NumberFormat.getCurrencyInstance().format((parsed/100));

           current = formated;
           loanText.setText(formated);
           loanText.setSelection(formated.length());
        
    

【讨论】:

以上是关于添加 TextChanged 实现后清除 EditText 文本的主要内容,如果未能解决你的问题,请参考以下文章

delphi 如何实现grid组件在鼠标双击某一行后获得这一行的数据并将数据写到相应的edit中?

发出textChanged()信号时,获取TextEdit更改

TextBox.TextChanged & ICommandSource

edit this cookie chrome插件 (HttpAnalyzerStdV3 获取Cookie 后,再用edit this cookie添加cookie)

PyQt4:结合 textChanged 和 editingFinished 为 QLineEdit

如何动态添加 mdSuffix 组件