实时过滤输入?
问题描述:
我有一个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));
}
答
有几个问题来处理这里之前,你可以达到你想要的那种功能。
-
无论何时处理TextWatcher,在设置被监视的EditText对象的文本时都需要小心。原因是每次你调用setText时,它都会再次触发观察者,导致你的代码进入无限循环。
为了防止出现这种情况,您应该将要设置的文本的值设置为onTextChanged方法之外的变量。输入方法时,请检查该变量,如果值与CharSequence不同,则只执行处理代码。
-
的整数变量userInputInt,当除以100,将等于零。
这应改为双重产生类似0.02等
-
值的这些变化后,我们可以得到的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());
}
}
});
作品完美,谢谢! – Roger 2011-02-25 15:54:33