Android EditText setSelection IndexOutOfBoundsException:setSpan (N ... N) ends beyond length N

提示:分析内容过长,如果耽误您宝贵时间,可以直接看末尾解决方案。

strat-----------------------------------------------------------------------------

在这里插入图片描述

理解字面意思:在设置Edit光标的时候,测量Edit content length 的时候为0,也就是没有发现测量的内容

先分析源码:
在这里插入图片描述
Edit setSelection 其实是调用了Selection的setSelection方法,进入Selection的setSelection查看。

在这里插入图片描述
这里可以看到Selection的setSelection方法是一个多态的实现方式,再找到 setSelection(text, index, index);
在这里插入图片描述
这里决定了光标的起始和结束的位置,这里我们直接进入getSelectionStart或者 getSelectionEnd查看,因为我们设置setSelection只调用一个形参的方法,所以下面判断肯定是相等的。
在这里插入图片描述
这个方法是判断控件是否已有光标,没有则不设置光标位置。再进入Spanned的getSpanStart方法。
在这里插入图片描述
可以看到,它是一个接口实现类,具体在哪里实现了呢?我们回到控制台查看异常。

在这里插入图片描述
这里是调用顺序,也就是说EditText => Selection => SpannableStringBuilder,我们直接看SpannableStringBuilder源码。

在这里插入图片描述
SpannableStringBuilder实例化的时候就实现了Spanned的getSpanStart方法,接着往下看。

在这里插入图片描述
这里有个测量范围值的方法,应该就是用来测量测容长度的一个实现方法。再找到chekeRange。

在这里插入图片描述
问题已经显而易见了,也就是说,strat或者end大于文本内容的长度,所以直接抛出异常。

也就说可能你的EditText里面没有内容,或者是EditText设置了maxLength,而strat或end大于maxLength,这些情况都会报这类错误,所以检查一下自己的代码有没有以上描述的两种情况就行了

end-----------------------------------------------------------------------------
本人菜鸟一枚,不足之处,还望指点

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值