2015-11-20 6 views
9

में टेक्स्ट का चयन करते समय अवैध अर्ग्यूमेंट अपवाद, एक चुनिंदा एंड्रॉइड टेक्स्ट व्यू में टेक्स्ट को अचयनित करते समय मुझे एक क्रैश का सामना करना पड़ा। यह तब होता है जब मैं एक टेक्स्ट व्यू चुनने योग्य बनाता हूं और LinkMovementMethod सेट करता हूं।एंड्रॉइड टेक्स्टव्यू

IllegalArgumentException in TextView

लगता है यह एंड्रॉयड के अंदर एक बग है।

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) 

उत्तर

10

उत्तर के लिए धन्यवाद mariotaku। किसी कारण से यह मुझे वास्तव में मेरे टेक्स्ट व्यू में टेक्स्ट का चयन नहीं करेगा। जब मैंने कुछ पात्रों का चयन किया है तो मैंने केवल काम को ट्रिगर करने के लिए थोड़ा सा tweaked। ऐसा लगता है कि अब बहुत अच्छा काम कर रहा है!

@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

यह सिर्फ मेरे जीवन को बचाया! आपका बहुत बहुत धन्यवाद! – Arreis

+0

मुझे भी इसी तरह के मुद्दे का सामना करना पड़ रहा है, मुझे इस विधि को रखने की आवश्यकता कहां है। – vijaypalod

+1

हे @ एमवीजे। आपको टेक्स्टव्यू को मारियोटाकू के उत्तर की तरह नीचे विस्तार करने की आवश्यकता है। असल में उसका जवाब देखें लेकिन इसके अंदर प्रेषण टचवेन्ट विधि को प्रतिस्थापित करें। यह आपके प्रोजेक्ट में फिक्स्डटेक्स्टव्यू (या जो भी आप इसे कॉल करना चाहते हैं) नामक एक नई फाइल होगी और आप इसे डिफ़ॉल्ट टेक्स्ट व्यू – TrevorSStone

3

मैंने पाया जब setText बुला एंड्रॉयड TextView चयन साफ ​​हो जाएगा, इसलिए यहाँ इस समस्या के लिए एक सरल समाधान का है।

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

यहाँ एक सरल पूरी तरह से काम कर समाधान नहीं है। आपको इसे अपनी गतिविधि कक्षा में रखना चाहिए:

@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()); 
} 
संबंधित मुद्दे