2014-04-02 18 views
12

मैं टेक्स्ट व्यू पर कॉपी पेस्ट कार्यक्षमता जोड़ने की कोशिश कर रहा हूं। मैंने कोड registerForContextMenu(detailedText); और android:textIsSelectable="true" में भी जोड़ा है xml में। जब मैं इसे कॉपी करने की कोशिश कर रहा हूं तो यह अच्छी तरह से काम करता है, लेकिन जब यह टेक्स्ट व्यू की पहली स्थिति पर इंगित करता है, और हम पाठ का चयन करने की कोशिश करते हैं तो यह त्रुटि फेंकता है। जो मैंने नीचे दिखाया है। मैं इसे कैसे सुलझाऊं ? क्रिप्या मेरि सहायता करे।टेक्स्टव्यू से टेक्स्ट का चयन करते समय त्रुटि (java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) 0 से पहले शुरू होता है)

एक्सएमएल

<TextView 
      android:id="@+id/datailtext" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textIsSelectable="true" 
      android:layout_below="@+id/EMPTY" 
      android:text="@string/detailed_text"  
      /> 

त्रुटि

04-02 16:54:03.367: E/AndroidRuntime(10977): FATAL EXCEPTION: main 
    04-02 16:54:03.367: E/AndroidRuntime(10977): Process: com.example.app, PID: 10977 
    04-02 16:54:03.367: E/AndroidRuntime(10977): java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.text.SpannableStringInternal.checkRange(SpannableStringInternal.java:355) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:77) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.text.SpannableString.setSpan(SpannableString.java:46) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.text.Selection.setSelection(Selection.java:76) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.widget.Editor$SelectionEndHandleView.updateSelection(Editor.java:3479) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.widget.Editor$HandleView.positionAtCursorOffset(Editor.java:3167) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.widget.Editor$SelectionEndHandleView.updatePosition(Editor.java:3494) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.widget.Editor$HandleView.onTouchEvent(Editor.java:3260) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.View.dispatchTouchEvent(View.java:7690) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.View.dispatchPointerEvent(View.java:7870) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3919) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3808) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3510) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3567) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5520) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5500) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5471) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5594) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5573) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5613) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.Choreographer.doFrame(Choreographer.java:530) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.os.Handler.handleCallback(Handler.java:733) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.os.Handler.dispatchMessage(Handler.java:95) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.os.Looper.loop(Looper.java:137) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at android.app.ActivityThread.main(ActivityThread.java:4998) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at java.lang.reflect.Method.invokeNative(Native Method) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at java.lang.reflect.Method.invoke(Method.java:515) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
    04-02 16:54:03.367: E/AndroidRuntime(10977): at dalvik.system.NativeStart.main(Native Method) 

अद्यतन कोड

ठीक है, मुझे पाठ दृश्य Android 2.3 पर कॉपी पेस्ट कार्यक्षमता को लागू करना चाहते हैं, मैं ऐसा किया है कोड में बहुत दूर, मैंने नीचे विस्तृत किया। कोई भी बेहतर सु एंड्रॉइड 2.3 में कार्यान्वयन के लिए झुकाव? कृपया मेरी मदद करें।

detailedText.setOnLongClickListener(new OnLongClickListener() { 

     @SuppressLint("NewApi") 
     @Override 
     public boolean onLongClick(View v) { 
      // TODO Auto-generated method stub 

      Log.d("LOG", "Detail text long pressed"); 

      int startIndex = detailedText.getSelectionStart(); 
      int endIndex = detailedText.getSelectionEnd(); 

      Log.d("LOG","startIndex "+ startIndex + "endIndex " + endIndex);///here get index -1 ,-1 for startIndex and endIndex in less than android 4.4 i dont know why? 


      String YouExtracted = stringYouExtracted.substring(startIndex,endIndex); 

      int sdk = android.os.Build.VERSION.SDK_INT; 
      if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { 
       android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
       clipboard.setText(detailedText.getText().toString()); 
      } else { 
       android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
       android.content.ClipData clip = android.content.ClipData 
         .newPlainText("COPYTEXT", detailedText.getText().toString()); 
       clipboard.setPrimaryClip(clip); 
      } 
      return true; 
     } 
    }); 

    setupSocialNetworkingLinks(); 
} 

/*@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    //user has long pressed your TextView 
    menu.add(0, v.getId(), 0, "COPYTEXT"); 

    //cast the received View to TextView so that you can get its text 
    TextView yourTextView = (TextView) detailedText; 

    int startIndex = detailedText.getSelectionStart(); 
    int endIndex = detailedText.getSelectionEnd(); 
    String YouExtracted = detailedText.getText().toString(); 

    //place your TextView's text in clipboard 
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { 
     android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
     clipboard.setText(YouExtracted); 
    } else { 
     android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
     android.content.ClipData clip = android.content.ClipData.newPlainText("COPYING", YouExtracted); 
     clipboard.setPrimaryClip(clip); 
    } 
} 
*/ 
+0

प्रलेखन से: 'लौटें चयन लंगर या कर्सर की भरपाई, या -1 अगर कोई चयन या कर्सर है। ' – donfuxx

+0

मैंने एंड्रॉइड 4.4 'getSelectionStart();' और 'getSelectionEnd();' यह मान वापस कर दिया है, लेकिन एंड्रॉइड 4.1.1 डिवाइस जैसे अन्य डिवाइस इसे वापस लौटाते हैं -1 –

+0

क्या आपने कभी इसे हल किया है? – AndroidEnthusiast

उत्तर

3

यह थोड़ा देर हो चुकी है, लेकिन क्या आप कस्टम LinkMovementMethod का उपयोग कर रहे हैं? मैंने एक ही अपवाद की खोज की, लेकिन जैसे ही मैं setCustomMovementMethod को टिप्पणी करता हूं, अपवाद गायब हो जाता है।

पता नहीं क्यों यह अभी तक होता है।

+0

किसी को भी यह अंतर्दृष्टि मिली है कि ऐसा क्यों होता है? मैं इसे एक नेक्सस 5 पर पुन: पेश नहीं कर सकता लेकिन क्रैश रिपोर्टों से यह दिखाता है कि यह 2 सोनी डिवाइस (4.4.4 और 4.4.2) – darnmason

+1

पर हो रहा है, मैंने इसे वापस लौटने के बजाय "सत्य" लौटकर हल किया "वापसी सुपर.ऑन टचवेन्ट (विजेट, बफर , घटना); " लेकिन मुझे अभी भी पता नहीं क्यों ऐसा होता है ... – freg

+0

बहुत धन्यवाद @freg, यह मेरे लिए काम करता है। बहुत कम लेकिन प्रभावी परिवर्तन। –

2

मुझे टेक्स्टव्यू में टेक्स्ट चुनने में एक ही समस्या थी। यह घटनाक्रम है, क्योंकि TextView SpannableString का उपयोग करता है, लेकिन स्थैतिक विधि चयनित .getSelectionStart (CharSequence टेक्स्ट) वापसी -1 यदि पाठ स्पैन किए गए उदाहरण का उदाहरण नहीं है। मैं इसे हल (और Android 6 के लिए https://code.google.com/p/android/issues/detail?id=191430) इस तरह ovveride dispatchTouchEvent:

public class HackyTextView extends TextView { 

    ... 

    @Override 
    public boolean dispatchTouchEvent(final MotionEvent event) { 
     // FIXME simple workaround to https://code.google.com/p/android/issues/detail?id=191430 
     int startSelection = getSelectionStart(); 
     int endSelection = getSelectionEnd(); 
     if (startSelection < 0 || endSelection < 0){ 
      Selection.setSelection((Spannable) getText(), getText().length()); 
     } else if (startSelection != endSelection) { 
      if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 
       final CharSequence text = getText(); 
       setText(null); 
       setText(text); 
      } 
     } 
     return super.dispatchTouchEvent(event); 
    } 
} 
संबंधित मुद्दे