将editText数字输入实时转换为不在真实设备中工作的百分比

时间:2018-03-22 18:55:21

标签: android android-edittext textwatcher

我正在尝试将editText的输入转换为百分比,而用户在真实设备上输入它,以下代码无法正常工作。它在模拟器上格式正确。

public class PercentTextWatcher implements TextWatcher {

private final EditText percentage;
private final Locale locale;


public PercentTextWatcher(EditText percentage, Locale locale) {
    this.percentage = percentage;
    this.locale = locale;
}

@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}

@Override
public void afterTextChanged(Editable editable) {
    percentage.removeTextChangedListener(this);
    if (percentage == null) return;
    percentage.removeTextChangedListener(this);

    NumberFormat format = NumberFormat.getPercentInstance(locale);
    format.setMaximumFractionDigits(4);
    String percentNumber = format.format(convertToDouble(percentage.getText().toString())/1000);

    percentage.setText(percentNumber);
    percentage.setSelection(percentNumber.length()-1);
    percentage.addTextChangedListener(this);

}

private double convertToDouble(String value) {
    double convertedNumber = 0;
    NumberFormat nf = new DecimalFormat("##,##");
    try {
        convertedNumber = nf.parse(value).doubleValue();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return convertedNumber;
}

键盘在第一个字符后不再接受输入,例如返回0,001%。

1 个答案:

答案 0 :(得分:1)

问题的根源是您尝试访问一些不存在的索引,这就是IndexOutOfBoundsException的原因。我相信可能有2个地方

1。您正在使用

percentage.setSelection(formatted.length());

并且索引以0开头。所以,请尝试

percentage.setSelection(formatted.length()-1);

2。您可能需要将文字设置为textview,其长度超过textview

中输入的允许长度

希望这能帮到你!