在Android上的IndexOutOfBoundsException,在SpannableStringBuilder.checkRange上的Code之外

Bas*_*ein 20 android android-8.0-oreo

问题

自从升级到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)
Run Code Online (Sandbox Code Playgroud)

可能的原因

因为它发生在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="" />
Run Code Online (Sandbox Code Playgroud)

试过的解决方案

为了有希望修复这个错误,我已经重写了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="" />
Run Code Online (Sandbox Code Playgroud)

小智 6

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

在我的情况下,当单击 Linkify 创建的链接时触发了 IndexOutOfBounds 异常。

Linkify.addLinks(text, path, null, matchFilter, transforFilter);
Run Code Online (Sandbox Code Playgroud)

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

  • 我没有使用linkify,但我发现在三星Android 8 上toUpper() 和toLower() 的tinysql 实现中有一个错误。在我的情况下,删除那些最终解决了thr 问题。我会将您的答案标记为已接受,因为这确实是导致此崩溃的另一个三星问题。 (3认同)