我有一个带有监听器的EditText(接受0-9)。我想在输入时抓取输入,应用计算,并在同一个EditText框中显示它。
该框最初显示0.00美元。当用户输入2时,我想从框中抓取它,解析它以删除$和小数,将其转换为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));
}
答案 0 :(得分:1)
在您实现所需的功能之前,有一些问题需要处理。
每当您处理TextWatcher时,在设置正在观看的EditText对象的文本时都需要小心。原因是每次调用setText时,它都会再次触发观察者,导致代码进入无限循环。
要防止这种情况,您应该将要设置的文本值设置为onTextChanged方法之外的变量。输入方法时,请检查此变量,并仅在值与CharSequence不同时执行处理代码
整数变量userInputInt除以100时将等于零。
应将其更改为double以生成0.02等值
在这些更改之后,我们可以在输入2之后让EditText显示$ 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());
}
}
});