Android 8.0 中的 IndexOutOfBoundsException SpannableStringBuilder.checkRange 外部代码

IndexOutOfBoundsException in Android 8.0 outside Code on SpannableStringBuilder.checkRange

问题

自从升级到 Android 8.0 后,我收到许多崩溃报告,指出 IndexOutOfBoundsException 发生在我的代码之外。

崩溃报告

应用程序中没有导致崩溃的代码,这似乎是 Android 本身的错误。

java.lang.IndexOutOfBoundsException: 
  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:10357)
  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.accessibility.AccessibilityRecord.setSource (AccessibilityRecord.java:146)
  at android.view.accessibility.AccessibilityRecord.setSource (AccessibilityRecord.java:119)
  at android.view.View.onInitializeAccessibilityEventInternal (View.java:7203)
  at android.widget.TextView.onInitializeAccessibilityEventInternal (TextView.java:10338)
  at android.view.View.onInitializeAccessibilityEvent (View.java:7191)
  at android.view.View.sendAccessibilityEventUncheckedInternal (View.java:7053)
  at android.view.View.sendAccessibilityEventUnchecked (View.java:7038)
  at android.view.View.sendAccessibilityEventInternal (View.java:7015)
  at android.widget.TextView.sendAccessibilityEventInternal (TextView.java:10725)
  at android.view.View.sendAccessibilityEvent (View.java:6982)
  at android.widget.TextView.onSelectionChanged (TextView.java:9269)
  at android.widget.TextView.spanChange (TextView.java:9505)
  at android.widget.TextView$ChangeWatcher.onSpanRemoved (TextView.java:11943)
  at android.text.SpannableStringInternal.sendSpanRemoved (SpannableStringInternal.java:408)
  at android.text.SpannableStringInternal.removeSpan (SpannableStringInternal.java:243)
  at android.text.SpannableString.removeSpan (SpannableString.java:50)
  at android.text.Selection.removeSelection (Selection.java:109)
  at android.text.method.LinkMovementMethod.onTakeFocus (LinkMovementMethod.java:239)
  at android.widget.Editor.onFocusChanged (Editor.java:1163)
  at android.widget.TextView.onFocusChanged (TextView.java:9586)
  at android.view.View.handleFocusGainInternal (View.java:6593)
  at android.view.View.requestFocusNoSearch (View.java:10823)
  at android.view.View.requestFocus (View.java:10802)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3160)
  at android.view.ViewGroup.onRequestFocusInDescendants (ViewGroup.java:3204)
  at android.view.ViewGroup.requestFocus (ViewGroup.java:3163)
  at android.view.View.requestFocus (View.java:10769)
  at android.view.View.requestFocus (View.java:10711)
  at android.view.ViewRootImpl.focusableViewAvailable (ViewRootImpl.java:3430)
  at android.view.View.setFlags (View.java:13277)
  at android.view.View.setVisibility (View.java:9378)
  at android.app.Activity.makeVisible (Activity.java:5412)
  at android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3785)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2898)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1593)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6541)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

可能原因

因为它发生在 TextView 我认为它与我使用的这些元素有关:

         <TextView
              android:id="@+id/txtAlso"
              android:layout_width="0dp"
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:textColor="#0000AA"
              android:padding="5dp"
              android:textIsSelectable="true"
              android:text="" />

尝试过的解决方案

为了修复此错误,我已将 TextViews 重写为以下代码,删除了 isSelectable 标记并阻止视图聚焦。 由于我自己无法重现该错误,因此我希望尽快获得更多信息。如果谁有信息、见解或知道解决方案回复或评论。

         <TextView
              android:id="@+id/txtAlso"
              android:layout_width="0dp"
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:textColor="#0000AA"
              android:padding="5dp"
              android:focusable="false" android:focusableInTouchMode="false"
              android:text="" />

我的应用程序发生了同样的崩溃。经过大量研究和测试,我设法重新创建了它。崩溃只发生在 Oreo Android 8.0 设备上,几乎只发生在三星设备上。

在我的案例中,IndexOutOfBounds 异常是在单击由 Linkify 创建的 link 时触发的。

Linkify.addLinks(text, path, null, matchFilter, transforFilter);

我删除了 Linkify 并找到了另一种无需 Linkify 即可完成所需操作的方法。