由于Spannable TextView导致的java.lang.IllegalArgumentException

时间:2018-03-11 07:02:49

标签: android 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("\n\nExample");
        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是否有任何问题?

4 个答案:

答案 0 :(得分:2)

我已删除 Html.fromHtml(定义[0]) \ n \ n 。然后它运作良好。如果这两件事即将到来,请测试这两件事。

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(定义[0])。不确定为什么使用 \ n \ n 它会转到下一行。

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

感谢。

答案 1 :(得分:2)

例外是指AOSP中的this line。 我想你的代码中有这一行:

"\n\nExample"

正在创建一个负数或其他无效的偏移值(可能是因为您正在追加SELECT satker.kode_satker,GROUP_CONCAT(DISTINCT(data.map) ,'-',value SEPARATOR '\n') as newvalue FROM satker left join data on data.kode_satker=satker.kode_satker GROUP BY data.kode_satker ?有没有办法可以在资源字符串中嵌入该示例字符串?

答案 2 :(得分:2)

由于并非所有代码都在此处共享,因此对我而言,实际问题并不明显。异常似乎是由Choreographer中可选择的TextView中的光标位置超出范围引起的。从WordIterator.java源代码我看到:

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

我个人没有遇到过这个问题,但是在调用setText时Android会清除TextView选项的问题,正如本文IllegalArgumentException while selecting text in Android TextView

中解释的那样(有一些解决方法) 祝你好运!

答案 3 :(得分:0)

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

,编码工作正常

Html.fromHtml(definition[0])

可能存在问题