在实现onTextChanged后清除EditText文本

14

我正在给一个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。 - Matthew
尝试移除String current并使用if(s.toString().length() != 0) {}。 - MataMix
请查看此链接:https://dev59.com/imjWa4cB1Zd3GeqPtr0P#67753559 - Mori
5个回答

21
问题在于你的看到你正在“清除”文本,因此发送请求到其回调方法(afterTextChanged、beforeTextChanged等)。
我所做的是简单地移除 ,清除文本,并将重新添加到中。这样,没有任何东西监听我的更改。
您可能需要保存实例,而不是像您所做的那样内联。这样您就不必每次清除时都创建一个新的。
  1. loanText.removeTextChangedListener(yourTextWatcherObject);
  2. loanText.setText("");
  3. loanText.addTextChangedListener(yourTextWatcherObject);

4
我建议使用一个布尔变量来控制监听器是否应执行任何操作。 - maaartinus
它对我不起作用,是否有示例代码或其他解决方案?谢谢。 - Hardik Vasani

4

建议使用afterTextChanged。我也曾经遇到过其他方法的很多问题。


1

1
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);
}   

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

-1
您可以在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());
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接