android - java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) 在 Android 8.0 的 0 之前开始
问题描述
问题自从升级到 Android 8.0 以来,我收到许多崩溃报告,指出在我的代码之外发生的 IndexOutOfBoundsException。但与其他问题不同
崩溃报告似乎是Android本身的一个错误。但我猜它是在我使用TextView内容中的链接时出现的。
Fatal Exception: java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0
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:2510)
at android.widget.TextView.onInitializeAccessibilityNodeInfoInternal(TextView.java:12047)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:7958)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:7917)
at android.view.View.createAccessibilityNodeInfo(View.java:7902)
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:7854)
at android.widget.TextView.onInitializeAccessibilityEventInternal(TextView.java:12028)
at android.view.View.onInitializeAccessibilityEvent(View.java:7842)
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:7704)
at android.view.View.sendAccessibilityEventUnchecked(View.java:7689)
at android.view.View.sendAccessibilityEventInternal(View.java:7666)
at android.widget.TextView.sendAccessibilityEventInternal(TextView.java:12418)
at android.view.View.sendAccessibilityEvent(View.java:7633)
at android.widget.TextView.onSelectionChanged(TextView.java:10559)
at android.widget.TextView.spanChange(TextView.java:10844)
at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:14126)
at android.text.SpannableStringInternal.sendSpanAdded(SpannableStringInternal.java:399)
at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:222)
at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:152)
at android.text.SpannableString.setSpan(SpannableString.java:46)
at android.text.Selection.setSelection(Selection.java:78)
at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:218)
at android.widget.TextView.onTouchEvent(TextView.java:11325)
at android.view.View.dispatchTouchEvent(View.java:12539)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3159)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2786)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:600)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1871)
at android.app.Activity.dispatchTouchEvent(Activity.java:3384)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:562)
at android.view.View.dispatchPointerEvent(View.java:12787)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5625)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5420)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4913)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4966)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4932)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5069)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4940)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5126)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4913)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4966)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4932)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4940)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4913)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7672)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7612)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7573)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7783)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:197)
at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
at android.os.MessageQueue.next(MessageQueue.java:325)
at android.os.Looper.loop(Looper.java:142)
at android.app.ActivityThread.main(ActivityThread.java:6940)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
在源码中,AccessibilityNodeInfo.java 和方法 setText(),可能有问题。但我不知道。我需要帮助。谢谢
public void setText(CharSequence text) {
enforceNotSealed();
mOriginalText = text;
// Replace any ClickableSpans in mText with placeholders
if (text instanceof Spanned) {
ClickableSpan[] spans =
((Spanned) text).getSpans(0, text.length(), ClickableSpan.class);
if (spans.length > 0) {
Spannable spannable = new SpannableStringBuilder(text);
for (int i = 0; i < spans.length; i++) {
ClickableSpan span = spans[i];
if ((span instanceof AccessibilityClickableSpan)
|| (span instanceof AccessibilityURLSpan)) {
// We've already done enough
break;
}
int spanToReplaceStart = spannable.getSpanStart(span);
int spanToReplaceEnd = spannable.getSpanEnd(span);
int spanToReplaceFlags = spannable.getSpanFlags(span);
spannable.removeSpan(span);
ClickableSpan replacementSpan = (span instanceof URLSpan)
? new AccessibilityURLSpan((URLSpan) span)
: new AccessibilityClickableSpan(span.getId());
spannable.setSpan(replacementSpan, spanToReplaceStart, spanToReplaceEnd,
spanToReplaceFlags);
}
mText = spannable;
return;
}
}
mText = (text == null) ? null : text.subSequence(0, text.length());
}
解决方案
尝试使用字符串而不是字符序列,请确保文本值不为空
推荐阅读
- python - Turtle 中的边界检测
- python-3.x - 沙盒访问冲突:阻止框架访问跨域框架。正在访问的框架是沙盒并且缺少“allow-same-origin”标志
- google-cloud-platform - Google Cloud Platform 上的 MVC 5 和外部登录(使用 Google 帐户)返回 null
- html - 使用飞碟生成风景 pdf?
- javascript - 匹配以字母开头和结尾的显示名称的正则表达式
- javascript - webview android中的JsQRScanner不起作用
- go - 执行 Go 文件时出错:文件不存在
- android - Android 活动和前台服务 - 一般问题
- php - 在 Linux CentOS 7 上通过 PHP 连接到 SQL Server 是否有任何特定设置
- css - css 规则问题在生产中被过度使用