实时过滤输入?

问题描述:

我有一个EditText(接受0-9)与一个监听器。我想在输入时输入它,应用一个计算,并将它显示在同一个EditText框中。实时过滤输入?

该框最初显示$ 0.00。当用户输入2时,我想从盒子中抓取它,解析它以除去$和decimal,将其转换为int ...将其除以100,并将$放在它的前面。在setText之后,它应该显示$ 0.02。如果他们然后按5,我会抓住它,解析它,结束了25,做数学,它应该显示$ 0.25等。

我不知道这是最好的方式,我是接受新的想法。这里是我当前的代码:

mEditPrice.addTextChangedListener(new TextWatcher(){ 
     DecimalFormat dec = new DecimalFormat("0.00"); 
     @Override 
     public void afterTextChanged(Editable arg0) { 
     } 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, 
       int count, int after) { 
     } 
     @Override 
     public void onTextChanged(CharSequence s, int start, 
       int before, int count) { 
      String userInput = mEditPrice.getText().toString().replaceAll("[^\\d]", ""); 
      int userInputInt = Integer.parseInt(userInput); 
      mEditPrice.setText("$"+dec.format(userInputInt/100)); 
     } 

有几个问题来处理这里之前,你可以达到你想要的那种功能。

  1. 无论何时处理TextWatcher,在设置被监视的EditText对象的文本时都需要小心。原因是每次你调用setText时,它都会再次触发观察者,导致你的代码进入无限循环。

    为了防止出现这种情况,您应该将要设置的文本的值设置为onTextChanged方法之外的变量。输入方法时,请检查该变量,如果值与CharSequence不同,则只执行处理代码。

  2. 的整数变量userInputInt,当除以100,将等于零。

    这应改为双重产生类似0.02等

  3. 值的这些变化后,我们可以得到的EditText进入一个2后显示$ 0.02,但因为我们设定的值在代码中的EditText中,EditText的下一个条目将被添加到文本的开头。那么如果我们输入'5',我们得到50.02美元。

    为了克服这个问题,我们需要做的最后一件事就是使用set position方法将EditText的位置设置为字符串的末尾。

下面是最终的解决方案:

private String value; 

mEditPrice.addTextChangedListener(new TextWatcher(){ 
    DecimalFormat dec = new DecimalFormat("0.00"); 

    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 

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

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if (!s.toString().equals(value)){ 
      String userInput = mEditPrice.getText().toString().replaceAll("[^\\d]", ""); 
      double userInputDouble = Double.parseDouble(userInput); 
      value = ("$"+dec.format(userInputDouble/100)); 

      mEditPrice.setText(value); 
      mEditPrice.setSelection(value.length()); 
     } 
    } 
}); 
+0

作品完美,谢谢! – Roger 2011-02-25 15:54:33