java.lang.IndexOutOfBondsException:setSpan(3..3) ends beyond length 2

来源:互联网 发布:数据库三大范式好处 编辑:程序博客网 时间:2024/04/25 14:43

在友盟的错误统计,看到这个错误。

这里写图片描述

然后,找到项目中的代码。代码如下:

 TextWatcher withdrawalWatcher = new TextWatcher() {        @Override        public void onTextChanged(CharSequence s, int start, int before, int count) {            String cash = s.toString();            int length = cash.length();            String zero = Constants.VAR_ZERO;            String dot = Constants.HIDDEN_PREFIX;            if (cash.startsWith(dot)) {                cash = zero + cash;                edtWithdrawal.setText(cash);                edtWithdrawal.setSelection(cash.length());            } else if (cash.contains(dot)) {                if ((length - 1) - cash.indexOf(dot) > 2) {                    cash = cash.substring(0, cash.indexOf(dot) + 3);                    edtWithdrawal.setText(cash);                    edtWithdrawal.setSelection(cash.length());                }            } else if (cash.startsWith(zero) && length > 1 && !cash.substring(1, 2).equals(dot)) {                String subCash = cash.substring(1, length);                edtWithdrawal.setText(subCash);                edtWithdrawal.setSelection(subCash.length());            } else if (length > 1 && (Double.parseDouble(cash) > mCashTotal)) {                String more = cash.substring(0, length - 1);                edtWithdrawal.setText(more);                edtWithdrawal.setSelection(more.length());            }

报错:是问题出现在这里。

else if (length > 1 && (Double.parseDouble(cash) > mCashTotal)) {                String more = cash.substring(0, length - 1);                edtWithdrawal.setText(more);                edtWithdrawal.setSelection(more.length());            }

简要的说下,这个代码的作用,就是判断用户输入的数字(##.##类型),是否大于给定的数字,如果大于,就删除最后一次输入的数据。结果,就出现这样的问题。

后来,测试发现,如果 mCashTotal = 80 edittext 输入数据是33.00,这样不报错。如果点击输入框,在33中间输入一个3,立刻就会报这个错误。

可见,这样的判断有问题。后来,想到另外一种解决办法。就是如果超出,就保留上次的输入值就可以了。代码如下:

这里写图片描述

如果超过最大值,记录上次的输入值,然后赋值给edittext,光标移到上次的位置,解决问题。

0 0
原创粉丝点击