2012-04-21 20 views
8

से टेक्स्ट स्थिति कैसे प्राप्त करें मैं एक कस्टम टेक्स्ट इंटरफ़ेस को कार्यान्वित करना चाहता हूं, स्पर्श-ड्रैग टेक्स्ट और कीबोर्ड को उठाए बिना, लंबे समय तक क्लिक करने के डिफ़ॉल्ट व्यवहार के विपरीत, सीसीपी मेनू और कीबोर्ड। मेरी समझ से पता चलता है मैं इस दृष्टिकोण की जरूरत है:एंड्रॉइड: टच इवेंट

onTouchEvent(event){ 
    case touch_down: 
    get START text position 

    case drag 
    get END text position 
    set selection range from START to END 
} 

मैं सब के बारे में getSelectStart() और एक सीमा है और इस तरह की स्थापना करने के लिए विभिन्न तरीकों का पता चला है, लेकिन मैं एक स्पर्श घटना पर आधारित पाठ स्थिति पाने के लिए नहीं मिल सकता है getX() और getY()। क्या इसे करने का कोई तरीका है? मैंने दूसरे कार्यालय ऐप्स में जो व्यवहार चाहते हैं उसे देखा है।

इसके अलावा, मैन्युअल रूप से अनुरोध किए जाने तक कीबोर्ड को प्रदर्शित करने से मैं कैसे रोकूं?

उत्तर

12

"mText.setInputType (इनपुट टाइप टाइप। TYPE_NULL)" सॉफ्ट कीबोर्ड दबाएगा लेकिन यह एंड्रॉइड 3.0 और उसके बाद के संस्करण के संपादन बॉक्स में ब्लिंकिंग कर्सर को भी अक्षम करता है। मैंने एक टचलिस्टर को कोड किया और कीबोर्ड को अक्षम करने के लिए सच लौटाया और फिर कर्सर को सही स्थान पर सेट करने के लिए गति ईवेंट से स्पर्श स्थिति प्राप्त करनी पड़ी। ड्रैगिंग के लिए टेक्स्ट का चयन करने के लिए आप इसे ACTION_MOVE गति ईवेंट पर उपयोग करने में सक्षम हो सकते हैं।

यहाँ कोड मैं प्रयोग किया जाता है: शुरू कोड साझा करने के लिए

mText = (EditText) findViewById(R.id.editText1); 
    OnTouchListener otl = new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      Layout layout = ((EditText) v).getLayout(); 
      float x = event.getX() + mText.getScrollX(); 
      int offset = layout.getOffsetForHorizontal(0, x); 
      if(offset>0) 
       if(x>layout.getLineMax(0)) 
        mText.setSelection(offset);  // touch was at end of text 
       else 
        mText.setSelection(offset - 1); 
      break; 
      } 
     return true; 
     } 
    }; 
    mText.setOnTouchListener(otl); 
+2

मैं लाइन पर नल पॉइंटर एक्सेप्शन मिला ::: "ऑफसेट int = layout.getOffsetForHorizontal (0, एक्स)," –

10

धन्यवाद Waine कैल, लेकिन यह केवल घटना की "x" अक्ष संभाला। के लिए बहु EditText, आप भी करना होगा:

1- ऊर्ध्वाधर स्थिति (y) की गणना करें:
2- लाइन लाइन और क्षैतिज स्थिति का उपयोग कर ऑफसेट ऊर्ध्वाधर स्थिति
3 पाठ प्राप्त की भरपाई हो जाओ

EditText et = (EditText) findViewById(R.id.editText1); 

long offset = -1; //text position will be corrected when touching. 

et.setOnTouchListener(new OnTouchListener() { 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_UP: 
      Layout layout = ((EditText) v).getLayout(); 
      float x = event.getX() + et.getScrollX(); 
      float y = event.getY() + et.getScrollY();    
      int line = layout.getLineForVertical((int) y);      

// Here is what you wanted: 

      offset = layout.getOffsetForHorizontal(line, x); 

      break; 
     } 
    return false; 
} 
}); 
+0

धन्यवाद यह मेरी मदद करें ... :) – ADT

+0

मुझे लेआउट के लिए नल पॉइंटर अपवाद मिल रहा है, क्यों? मुझे नहीं पता। लेआउट के लिए – Dharmishtha

+0

मैंने ऐसा कुछ किया था। ViewTreeObserver vto = edittext.getViewTreeObserver(); vto.addOnGlobalLayoutListener (नई ViewTreeObserver.OnGlobalLayoutListener() { @Override सार्वजनिक शून्य onGlobalLayout() { लेआउट = edittext.getLayout();} }); – Dharmishtha

2

मेरे आवेदन के लिए मुझे टचलिस्टर के भीतर स्थिति प्राप्त करने की आवश्यकता है लेकिन उपरोक्त समाधान एक सटीक स्थान नहीं देता है। मेरे लिए पाठ कर्सर के सापेक्ष 1-2 वर्णों से अधिक नहीं था। नीचे दिया गया कोड हल करता है। इसे काम करने के लिए कुंजी कर्सर स्थिति अद्यतन होने के बाद कोड को स्थगित करने के लिए पोस्ट() का उपयोग करना है। इस प्रकार मुझे प्राप्त स्थिति को EditText के साथ सहमत होने की गारंटी है, और कोड भी आसान है।

setOnTouchListener(new OnTouchListener() 
    { 
    @Override 
    public boolean onTouch(View view, MotionEvent event) 
     { 
     if(event.getAction()==MotionEvent.ACTION_UP) 
      { 
      //At this point the selection has not been updated. So post an 
      //event at the end of the event queue to check where cursor 
      //has been moved 
      post(new Runnable() 
       { 
       public void run() 
        { 
        Editable sb=getText(); 
        int currentPos=getSelectionStart(); 
        //TODO 
        } 
       }); 
      } 
     return false; 
     } 
    }); 
4

मुझे भी एक ही समस्या का सामना करना पड़ रहा है। और जब मैंने "int offset = layout.getOffsetForHorizontal (0, x) का उपयोग करने का प्रयास किया;" जैसे Wayne Kail ने कहा, इस लाइन में एनपीई भी मिला। इसलिए मैं करने की कोशिश की और अंत में इस प्रकार लिख:

mText = (EditText) findViewById(R.id.editText1); 
OnTouchListener otl = new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     EditText editText = (EditText) v; 
     float x = event.getX(); 
     float y = event.getY(); 
     int touchPosition = editText.getOffsetForPosition(x, y); 
     if (touchPosition>0){ 
      editText.setSelection(touchPosition); 
     } 
     return true; 
    } 
}; 
mText.setOnTouchListener(otl); 
+0

मेरे लिए काम नहीं किया। – Dharmishtha

संबंधित मुद्दे