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

在我們應用的線上反饋中,收集到了一些如下到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。所以,如果你也出現了類似的問題,就需要檢查一下相關代碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章