为什么在尝试选择文本时应用程序会崩溃?

3

当我在TextView中多次尝试选择文本时,应用程序会崩溃并显示错误。

有人知道可能的问题是什么吗?

错误堆栈跟踪:

Original Answer翻译成"最初的回答"

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)

以下是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" />

在代码中我设置了属性:messageView.setMovementMethod(LinkMovementMethod.getInstance());,它的作用是使文本可以响应点击事件。

你能提供你在这里设置的字符串文本吗? - Shalu T D
我在ViewHolder中展示文本,文本可能不同,在任何情况下都存在这个错误。 - Павел Дреманович
4个回答

2
我能够在Android O和Android N上重现以下情况:
  • 给定一个RecyclerView,其中包含一个ViewHolder,该ViewHolder包含一个TextView

  • 该TextView使用.setTextIsSelectable(true).setMovementMethod(LinkMovementMethod.getInstance())

  • 从TextView中选择文本并从特定视图向下滚动将导致崩溃。特别是,在呈现提供“复制”,“剪切”,“粘贴”等选项的系统覆盖层时向下滚动

因此,我的解决方法(不是真正的解决方案,但它将防止崩溃,并且不会使用户退出我的应用程序)是不允许在受影响的版本上进行文本选择:
       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())

0

移除此行:android:lineSpacingExtra="3dp"


谢谢。但是这并没有帮助到我。 - Павел Дреманович
尝试使用 android:autoLink="web"。 - Mina George

0

尝试指定android:inputType="text"。此外,您还可以添加android:autoLink="all"


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接