IndexOutOfBoundsException в Android 8.0 вне кода на 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="" />

person Bas van Stein    schedule 26.09.2017    source источник
comment
Почему проголосовали? Пожалуйста, прокомментируйте, по крайней мере, когда вы голосуете против.   -  person Bas van Stein    schedule 26.09.2017
comment
Люди видят известные типы исключений — сразу предполагают, что это дубликат ????   -  person azizbekian    schedule 26.09.2017
comment
Отлично, я бы хотел, чтобы это было так, искал часы и не нашел такой же проблемы, нашел некоторые похожие проблемы в более ранних версиях Android, но ничего об Android 8. Спасибо за комментарий @azizbekian   -  person Bas van Stein    schedule 26.09.2017
comment
Вы нашли какую-либо проблему? У меня такая же проблема, но я не могу ее воспроизвести.   -  person Ioane Sharvadze    schedule 06.10.2017
comment
Пробное решение, кажется, работает до сих пор. Поэтому добавьте android:focusable="false" к текстовым просмотрам, которые его вызывают.   -  person Bas van Stein    schedule 06.10.2017
comment
@BasvanStein вы нашли исправление? Нам кажется, что это происходит только с телефонами Honor.   -  person Jonas Schmid    schedule 05.01.2018
comment
@ Джонас, это все еще происходит, но реже. Не уверен, на каких телефонах это происходит, видел журналы с телефоном Samsung и некоторыми другими.   -  person Bas van Stein    schedule 05.01.2018
comment
@BasvanStein спасибо за обновление!   -  person Jonas Schmid    schedule 05.01.2018
comment
Добавление android:focusable=false в текстовое представление является решением проблемы @Bas van Stein   -  person Vasu    schedule 23.05.2018
comment
Я также обнаружил, что эта ошибка вызывается LOWER и UPPER в tinysql на некоторых устройствах.   -  person Bas van Stein    schedule 25.06.2018


Ответы (1)


У меня был такой же сбой в моем приложении. После долгих исследований и испытаний мне удалось воссоздать его. Сбой произошел только на устройствах Oreo Android 8.0 и почти только на устройствах Samsung.

В моем случае исключение IndexOutOfBounds срабатывало при нажатии на ссылку, созданную Linkify.

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

Я удалил Linkify и нашел другой способ делать то, что мне нужно, без Linkify.

person Anders    schedule 09.08.2018
comment
Я не использовал linkify, но обнаружил ошибку в реализации toUpper() и toLower() в tinysql на Samsung Android 8. В моем случае удаление этих окончательно решило проблему. Я отмечу ваш ответ как принятый, так как это действительно еще одна проблема Samsung, которая вызывает этот сбой. - person Bas van Stein; 09.08.2018