java.lang.IllegalArgumentException due to Spannable TextView



我在Google Play管理中心收到了这个崩溃报告,我自己从未经历过,也无法重现。

java.lang.IllegalArgumentException: 
  at android.text.method.WordIterator.checkOffsetIsValid (WordIterator.java:380)
  at android.text.method.WordIterator.isBoundary (WordIterator.java:101)
  at android.widget.Editor$SelectionStartHandleView.positionAtCursorOffset (Editor.java:4300)
  at android.widget.Editor$HandleView.updatePosition (Editor.java:3736)
  at android.widget.Editor$PositionListener.onPreDraw (Editor.java:2513)
  at android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:944)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2417)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1321)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:6708)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:894)
  at android.view.Choreographer.doCallbacks (Choreographer.java:696)
  at android.view.Choreographer.doFrame (Choreographer.java:631)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:880)
  at android.os.Handler.handleCallback (Handler.java:815)
  at android.os.Handler.dispatchMessage (Handler.java:104)
  at android.os.Looper.loop (Looper.java:207)
  at android.app.ActivityThread.main (ActivityThread.java:5728)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:789)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:679)
崩溃

报告没有提到哪个类导致了崩溃。我最好的猜测是以下自定义TextView

private void customTextView(TextView view) {
        SpannableStringBuilder spanTxt = new SpannableStringBuilder(
                Html.fromHtml(definition[0]));
        spanTxt.append("nnExample");
        spanTxt.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View view) {
                showAlert();
            }
        }, spanTxt.length() -"Example".length(), spanTxt.length(), 0);
        view.setMovementMethod(LinkMovementMethod.getInstance());
        view.setText(spanTxt, TextView.BufferType.SPANNABLE);
    }

我的自定义TextView有任何问题吗?

我已经删除了你的Html.fromHtml(definition[0](。然后效果很好。请测试这两件事是否即将到来。

private void customTextView(TextView view) {
    SpannableStringBuilder spanTxt = new SpannableStringBuilder("Testing");
    spanTxt.append("Example");
    spanTxt.setSpan(new ClickableSpan() {
        @Override
        public void onClick(View view) {
          Log.e("tag","show click");
        }
    }, spanTxt.length() -"Example".length(), spanTxt.length(), 0);
    view.setMovementMethod(LinkMovementMethod.getInstance());
    view.setText(spanTxt, TextView.BufferType.SPANNABLE);
}

交叉检查您的文本,如果它不是。这个 Html.fromHtml(definition[0](。不知道为什么使用 它将转到下一行。

检查这两件事。其他人则工作得很好。

谢谢。

异常是指 AOSP 中的此行。我认为您的代码中的这一行:

spanTxt.length() -"Example".length()

是否创建了负数或其他无效的偏移值(可能是因为您要追加"nnExample"?有没有办法将示例字符串嵌入到资源字符串中?

由于并非所有代码都在此处共享,因此实际问题在哪里对我来说并不明显。异常似乎是由于编排器中可选文本视图中的光标位置超出界限引起的。从WordIterator.java源代码中我看到:

private void checkOffsetIsValid(int offset) {
   if (!(mStart <= offset && offset <= mEnd)) {
        throw new IllegalArgumentException("Invalid offset: " + (offset) +
           ". Valid range is [" + mStart + ", " + mEnd + "]");
   }
}

我个人没有遇到过这个问题,但是在Android文本视图中选择文本时,Android在调用setText时清除TextView选择可能存在问题,如本文中所述(有一些解决方法( 非法参数异常

祝你好运!

spantext代码没有问题。如果删除变量,编码工作正常 - Html.fromHtml(definition[0])

可能存在Html.fromHtml(definition[0])问题

最新更新