Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does the application crash when trying to select text?

When I try to select text many times in the TextView, the application crashes with the error.

Does anyone know what could be the problem?

Error Stacktrace:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: *** PID: 11481
    java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0
        at android.text.SpannableStringInternal.checkRange(SpannableStringInternal.java:442)
        at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:163)
        at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:152)
        at android.text.SpannableString.setSpan(SpannableString.java:46)
        at android.text.Selection.setSelection(Selection.java:76)
        at android.widget.Editor$SelectionModifierCursorController.resetDragAcceleratorState(Editor.java:5790)
        at android.widget.Editor$SelectionModifierCursorController.onTouchEvent(Editor.java:5627)
        at android.widget.Editor.onTouchEvent(Editor.java:1416)
        at android.widget.TextView.onTouchEvent(TextView.java:9922)
        at android.view.View.dispatchTouchEvent(View.java:11843)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
        ....
2019-07-28 16:00:53.369 11481-11481/? E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4650)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4623)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7222)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7196)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7157)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7379)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:379)
        at android.os.Looper.loop(Looper.java:144)
        at android.app.ActivityThread.main(ActivityThread.java:7383)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)

Here is the markup for TextView:

<TextView
        android:id="@+id/list_item_message_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:layout_marginBottom="6dp"
        android:gravity="center_vertical"
        android:inputType="none"
        android:linksClickable="true"
        android:singleLine="false"
        android:text="TextView"
        android:lineSpacingExtra="3dp"
        android:textIsSelectable="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

In the code I set the attribute: messageView.setMovementMethod (LinkMovementMethod.getInstance ());

like image 562
Павел Дреманович Avatar asked Dec 09 '25 09:12

Павел Дреманович


1 Answers

I was able to reproduce only on android O and android N, in the following scenario:

  • Given a RecyclerView which presents a ViewHolder containing a TextView

  • That TextView as .setTextIsSelectable(true) and .setMovementMethod(LinkMovementMethod.getInstance())

  • Selecting a text from TextView and scrolling away from that particular view will cause crash. In particular, scrolling away while having presented that system overlay which offers "Copy", "Cut", "Paste", etc

So, my workaround (not a real solution but it will prevent crashes and it doesn't take users out of my app) was not allowing text selection on affected builds:

       val selectable = when {
           Build.VERSION.SDK_INT <= Build.VERSION_CODES.M -> true
           Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> true
           else -> false
       }
       textView.setTextIsSelectable(selectable)
       textView.setMovementMethod(LinkMovementMethod.getInstance())
like image 193
Fernando Jascovich Avatar answered Dec 10 '25 22:12

Fernando Jascovich



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!