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

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

这里写图片描述

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

 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,光标移到上次的位置,解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值