java.lang.IndexOutOfBoundsException:charAt:-1<;SpannableStringBuilder中的0

java.lang.IndexOutOfBoundsException:charAt:-1<;SpannableStringBuilder中的0,java,android,spannablestring,Java,Android,Spannablestring,我有一个带有可点击的Spannable字符串的EditText 但是如果内容包含一个Spannable字符串,我点击它或移动光标 在其中,我得到了一个索引outofboundsexception 这是我的错误日志。 05-22 12:28:01.413: E/AndroidRuntime(5482): java.lang.IndexOutOfBoundsException: charAt: -1 < 0 05-22 12:28:01.413: E/AndroidRuntime(5482):

我有一个带有可点击的
Spannable
字符串的
EditText

但是如果内容包含一个
Spannable
字符串,我点击它或移动光标 在其中,我得到了一个
索引outofboundsexception

这是我的错误日志。

05-22 12:28:01.413: E/AndroidRuntime(5482): java.lang.IndexOutOfBoundsException: charAt: -1 < 0
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.text.SpannableStringBuilder.charAt(SpannableStringBuilder.java:112)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.text.Selection.setSelection(Selection.java:81)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.text.Selection.setSelection(Selection.java:115)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.widget.Editor$InsertionHandleView.updateSelection(Editor.java:3697)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.widget.Editor$HandleView.positionAtCursorOffset(Editor.java:3417)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.widget.Editor$HandleView.updatePosition(Editor.java:3444)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.widget.Editor$PositionListener.onPreDraw(Editor.java:2285)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1936)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1105)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4462)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.Choreographer.doFrame(Choreographer.java:525)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.os.Handler.handleCallback(Handler.java:615)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.os.Looper.loop(Looper.java:137)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at android.app.ActivityThread.main(ActivityThread.java:4895)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at java.lang.reflect.Method.invokeNative(Native Method)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at java.lang.reflect.Method.invoke(Method.java:511)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
05-22 12:28:01.413: E/AndroidRuntime(5482):     at dalvik.system.NativeStart.main(Native Method)```

05-22 12:28:01.413:E/AndroidRuntime(5482):java.lang.IndexOutOfBoundsException:charAt:-1<0
05-22 12:28:01.413:E/AndroidRuntime(5482):位于android.text.SpannableStringBuilder.charAt(SpannableStringBuilder.java:112)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.text.Selection.setSelection(Selection.java:81)中
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.text.Selection.setSelection(Selection.java:115)中
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.widget.Editor$InsertionHandleView.updateSelection(Editor.java:3697)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.widget.Editor$HandleView.positionAtCursorOffset(Editor.java:3417)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.widget.Editor$HandleView.updatePosition(Editor.java:3444)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.widget.Editor$PositionListener.onPreDraw(Editor.java:2285)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1936)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1105)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4462)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.Choreographer.doCallbacks(Choreographer.java:555)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.Choreographer.doFrame(Choreographer.java:525)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
05-22 12:28:01.413:E/AndroidRuntime(5482):位于android.os.Handler.handleCallback(Handler.java:615)
05-22 12:28:01.413:E/AndroidRuntime(5482):位于android.os.Handler.dispatchMessage(Handler.java:92)
05-22 12:28:01.413:E/AndroidRuntime(5482):在android.os.Looper.loop(Looper.java:137)
05-22 12:28:01.413:E/AndroidRuntime(5482):位于android.app.ActivityThread.main(ActivityThread.java:4895)
05-22 12:28:01.413:E/AndroidRuntime(5482):位于java.lang.reflect.Method.Invokenactive(本机方法)
05-22 12:28:01.413:E/AndroidRuntime(5482):在java.lang.reflect.Method.invoke(Method.java:511)
05-22 12:28:01.413:E/AndroidRuntime(5482):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
05-22 12:28:01.413:E/AndroidRuntime(5482):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
05-22 12:28:01.413:E/AndroidRuntime(5482):在dalvik.system.NativeStart.main(本机方法)```

索引值从
0
开始。您正试图访问索引
-1
(这是非法索引)处的字符,这就是出现异常的原因。可能您必须在遍历字符时修复超出有效索引的循环


请查看API

我遇到了类似的问题,看起来是由链接移动方法引起的,该方法用于我的可点击文本

在我的例子中,该问题仅通过
editText.setMovementMethod(LinkMovementMethod.getInstance())重现

因此,要在没有LinkMovementMethod的情况下处理ClickableSpan上的单击,请添加自定义onClickListener,如下所示:

editText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Editable editable = editText.getText();
                int pos = editText.getSelectionStart();
                ClickableSpan[] link = editable.getSpans(pos,pos, ClickableSpan.class);
                if (link.length != 0) {
                    link[0].onClick(v);
                }
            }
        });

请添加与错误相关的代码。“任何人都可以知道如何解决它”不要尝试访问不存在的索引。