IllegalArgumentException在Android TextView中select文本

我遇到了一个崩溃,同时取消selectAndroid TextView中的文本。 当我使TextView可选并设置LinkMovementMethod时,会发生这种情况。

TextView中的IllegalArgumentException

看来这是Android内部的一个错误。

java.lang.IllegalArgumentException: Invalid offset: -1. Valid range is [0, 10562] 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:4260) at android.widget.Editor$HandleView.updatePosition(Editor.java:3708) at android.widget.Editor$PositionListener.onPreDraw(Editor.java:2507) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2055) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Solutions Collecting From Web of "IllegalArgumentException在Android TextView中select文本"

谢谢mariotaku的答案。 由于某种原因,它不会我实际上在我的TextView中select文本。 我稍微调整了一下,只有在select某些字符时才触发工作。 现在好像工作得很好!

 @Override public boolean dispatchTouchEvent(MotionEvent event) { // FIXME simple workaround to https://code.google.com/p/android/issues/detail?id=191430 int startSelection = getSelectionStart(); int endSelection = getSelectionEnd(); if (startSelection != endSelection) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { final CharSequence text = getText(); setText(null); setText(text); } } return super.dispatchTouchEvent(event); } 

我发现Android在调用setText时候会清除TextView的select,所以这里是一个简单的解决这个问题的方法。

 public class FixedTextView extends TextView { public FixedTextView(final Context context) { super(context); } public FixedTextView(final Context context, final AttributeSet attrs) { super(context, attrs); } public FixedTextView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } @Override public boolean dispatchTouchEvent(MotionEvent event) { // FIXME simple workaround to https://code.google.com/p/android/issues/detail?id=191430 if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { final CharSequence text = getText(); setText(null); setText(text); } return super.dispatchTouchEvent(event); } } 

这是一个简单的完美工作的解决方法。 你应该把它放到你的Activity类中:

 @Override public void onActionModeStarted(ActionMode mode) { super.onActionModeStarted(mode); yourTextView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); } @Override public void onActionModeFinished(ActionMode mode) { super.onActionModeFinished(mode); yourTextView.setMovementMethod(LinkMovementMethod.getInstance()); }