Android 8.0出现的java.lang.IndexOutOfBoundsException: setSpan (-1 … -1) starts before 0

在Android8.0中,当开启TalkBack无障碍功能时,特定的代码设置会导致应用程序崩溃。涉及设置ClickableSpan,若endIndex等于startIndex,则会触发异常。正常情况下,此设置虽无效果但不会引发crash。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们应用的线上反馈中,收集到了一些如下到crash。只出现在Android 8.0的手机中。并没有找到任何其他有用的错误信息。

Exception: java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0
       at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1314)
       at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680)
       at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:672)
       at android.view.accessibility.AccessibilityNodeInfo.setText(AccessibilityNodeInfo.java:2474)
       at android.widget.TextView.onInitializeAccessibilityNodeInfoInternal(TextView.java:10378)
       at android.view.View.onInitializeAccessibilityNodeInfo(View.java:7307)
       at android.view.View.createAccessibilityNodeInfoInternal(View.java:7266)
       at android.view.View.createAccessibilityNodeInfo(View.java:7251)
       at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:981)
       at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1004)
       at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1004)
       at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:806)
       at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:170)
       at android.view.AccessibilityInteractionController.-wrap1(Unknown Source)
       at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1149)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:166)
       at android.app.ActivityThread.main(ActivityThread.java:6565)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

在对日志进行分析我们可以发现,他是涉及到了Android的无障碍相关的功能。而且是给文本设置ClickableSpan的时候出现的。在进行一系列的尝试后,我发现,如下的代码

 SpannableString ss = new SpannableString("123");
 ss.setSpan(new ClickableSpan(),1,1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 tv.setText(ss);

在正常的Android 8.0的使用中,并不会出现什么问题,但是如果手机开启了无障碍中的TalkBack功能的话,那么这段代码就必定会出现上述的crash。也就是说,在设置ClickableSpan的时候,如果设置的endIndex == startIndex 那么就会出现crash,,但是在正常的使用中,是可以进行这样的设置的,虽然没有什么显示效果,但是并不会出现任何crash。所以,如果你也出现了类似的问题,就需要检查一下相关代码了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值