2015-11-20 7 views
9

Ich habe einen Absturz beim Abwählen von Text in einem auswählbaren Android TextView festgestellt. Dies passiert, wenn ich TextView auswählbar mache und LinkMovementMethod festlege.IllegalArgumentException beim Auswählen von Text in Android TextView

IllegalArgumentException in TextView

scheint es ein Fehler innerhalb Android ist.

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) 

Antwort

10

Dank Mariotaku für die Antwort. Aus irgendeinem Grund würde ich mich nicht den Text in meinem TextView auswählen. Ich habe es ein wenig optimiert, um nur die Arbeit auszulösen, wenn einige Charaktere ausgewählt sind. Es scheint jetzt gut zu funktionieren!

@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); 
} 
+0

Das hat mir gerade das Leben gerettet! Danke vielmals! – Arreis

+0

Ich bin auch mit dem ähnlichen Problem konfrontiert, wo muss ich diese Methode behalten. – vijaypalod

+1

hey @ mVJ. Sie müssen TextView wie mariotaku's Antwort unten erweitern. Betrachten Sie im Grunde seine Antwort, aber ersetzen Sie die DispatchTouchEvent-Methode in ihm. Das wäre eine neue Datei in Ihrem Projekt namens FixedTextView (oder wie auch immer Sie es heißen möchten) und Sie würden es anstelle des Standard-TextViews referenzieren. – TrevorSStone

3

Ich fand Android Textview Auswahl löschen, wenn setText Aufruf, so ist hier eine einfache Abhilfe für dieses Problem.

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); 
    } 

} 
0

Hier ist eine einfache perfekt Workaround. Sie sollten dies in Ihre Aktivitätsklasse einfügen:

@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()); 
}