2011-06-08 15 views
12

मुझे यकीन नहीं है कि यह करने के बारे में कैसे जाना है, लेकिन मैं सोच रहा था कि कोई व्यक्ति टेक्स्टव्यू में स्ट्रिंग में स्थिति (अनुक्रमणिका) प्राप्त करने का कोई तरीका था, जब कोई व्यक्ति कहीं पर क्लिक करता है व्याख्यान दर्शन। तो, अगर कोई व्यक्ति निम्न TextView पर क्लिक करता है:टेक्स्ट व्यू में स्ट्रिंग में ऑनक्लिक स्थिति

Hello I'm Vinay Hiremath. 
पहले "एच" पर

, onClick ईवेंट पूर्णांक 0. अगर किसी को 'वी' पर क्लिक करता मिल जाएगा या, यह 10 हो जाएगा, और शीघ्र।

किसी भी मदद, हमेशा की तरह, बहुत सराहना की है। मुझे बेवकूफ कहने के लिए स्वतंत्र महसूस करें और चट्टानों को फेंक दें अगर यह Android Developers पर स्पष्ट रूप से है।

+1

ऐसा लगता है कि पूछ रहे हैं http://stackoverflow.com/questions/2302867/android-how- टू-निर्धारित-कैरेक्टर-इंडेक्स-ऑफ-ए-टच-इवेंट-पोजिशन-इन-टेक्स्टव्यू –

उत्तर

21

तो मैंने जेम्स मूर की टिप्पणी here में लिंक के माध्यम से इसे हल करने का अंत किया। मैं उस लिंक में टोनी ब्लूज़ के समाधान का उपयोग कर समाप्त हुआ। यह समाधान यह है:

1.) टेक्स्टव्यू पर ऑन टचलिस्टर सेट करें।

2.) TextView का लेआउट प्राप्त करें।

3.) घटना के माध्यम से स्पर्श के एक्स, वाई निर्देशांक प्राप्त करें।

4.) उस घटना के आधार पर लाइन और ऑफ़सेट (अनुक्रमणिका) खोजें।

निम्नलिखित कोड उदाहरण है कि कैसे एक लॉग इन करें होगा (वर्बोज़ में) एक स्पर्श एक TextView नामित manip दिया की सूचकांक:

manip.setOnTouchListener(new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     Layout layout = ((TextView) v).getLayout(); 
     int x = (int)event.getX(); 
     int y = (int)event.getY(); 
     if (layout!=null){ 
      int line = layout.getLineForVertical(y); 
      int offset = layout.getOffsetForHorizontal(line, x); 
      Log.v("index", ""+offset); 
     } 
     return true; 
    } 
}); 

संपादित करें: राहुल Mandaliya मेरा ध्यान करने के लिए यह लाया गया है कि इस कोड असफल हो जायेगी यदि टेक्स्ट व्यू पर पैडिंग है। दुर्भाग्यवश, यह बहुत लंबा समय रहा है क्योंकि मैंने कोई एंड्रॉइड कोड लिखा है, इसलिए मुझे यकीन नहीं है कि इस उत्तर को उस खाते में कैसे अपडेट किया जाए। सहजता से, ऐसा लगता है कि यदि आप पैडिंग मान जानते हैं तो क्लिक ईवेंट के खिलाफ आप किसी प्रकार की जांच कर सकते हैं। इस एज केस पर अधिक सहायक होने में सक्षम होने के बारे में खेद है। :-(

+0

यह केवल तभी काम करता है जब टेक्स्टिव की लेआउट चौड़ाई और ऊंचाई रैप सामग्री होती है। यदि आप चौड़ाई या ऊंचाई को माता-पिता भरते हैं तो अन्य ऑफसेट चयनित –

+0

@RahulMandaliya कौन सा ऑफ़सेट चुना गया है? मैं अपना जवाब अपडेट करूंगा - यह एक लंबा समय रहा है क्योंकि मैंने कोई एंड्रॉइड सामान किया है। :-P – Vinay

+0

बस अपने टेक्स्टव्यू पर पैडिंग जोड़ें और फिर बाहरी टेक्स्ट पर क्लिक करें, आपको टेक्स्टव्यू के लिए स्थिति जोड़नी है जैसे कि (ऑफ़सेट <= text.length()) फिर उसका काम –

2

इसे नमक के चुटकी से लें क्योंकि मुझे इसका परीक्षण करने का कोई मौका नहीं था।

सेट android:textIsSelectableTextView और उसके बाद के लिए true को विशेषता getSelectionStart() और getSelectionEnd() तरीकों का उपयोग।

फिर मैं वास्तव में सिर्फ एक शिक्षित अनुमान बना रहा हूं।

+0

धन्यवाद एक महान दिशा ओक्टावियन के लिए एक टन! यह वास्तव में भविष्य में कार्यक्षमता के लिए बहुत उपयोगी होगा जो मैं अपने ऐप में भी चाहूंगा, अगर यह काम करता है। हालांकि, जब भी मैं अपने एक्सएमएल लेआउट में "एंड्रॉइड: textIsSelectable =" true "" डालता हूं, तो यह मुझे बताता है कि "विशेषता के लिए कोई संसाधन पहचानकर्ता नहीं मिला 'टेक्स्ट Iselectable' पैकेज 'एंड्रॉइड' में। क्या आपको पता है कि इसका क्या अर्थ हो सकता है? ऐसा लगता है कि किसी को भी एक ही समस्या का सामना करना पड़ रहा था: http://androidforums.com/application-development/330162-how-do-i-make-textview-text-selectable.html लेकिन कोई जवाब नहीं मिला। किसी भी मदद की सराहना की है। – Vinay

+0

एक साइड नोट के रूप में, मैं समझता हूं कि यह समस्या पूरी तरह से कुछ अलग है, इसलिए, एक बार जब मैं पूरी "टेक्स्ट Ielectable" समस्या का पता लगाता हूं, तो क्या आप मेरी मदद कर सकते हैं या नहीं, अगर आपका उत्तर काम करता है, तो मैं आपको क्रेडिट और मार्क दूंगा यह इस सवाल का जवाब है। मैं हमेशा श्रेय देता हूं जहां यह देय है। – Vinay

+0

ओह। ऐसा लगता है कि यह मुद्दा मुझे नहीं बता रहा है कि विधि 'isTextSelectable() 'एपीआई स्तर' 11' (हनीकॉम) से है। मुझे यकीन नहीं है कि यह बिना काम करता है। मुझे इसे खुद कोशिश करनी होगी। –

3

1) एक सूची लें।

2) इस स्ट्रिंग को अलग वर्ण में विभाजित करें।

3) setOnItemClickListener (नया OnItemClickListener()) ईवेंट लें।

4) प्रत्येक चरित्र के लिए टोस्टर को प्राप्त करने के लिए टोस्ट दिखाएं।

यह आपकी मदद करेगा।

+0

अगर ऑक्टावियन का जवाब मेरे लिए काम करता है, तो मैं इसका उपयोग करने जा रहा हूं (यह मेरी आवश्यकताओं को थोड़ा बेहतर बनाता है), लेकिन इस समस्या से निपटने के लिए एक रचनात्मक/अलग तरीके के लिए +1। ;-) – Vinay

9

आप स्वीकार किए जाते हैं जवाब का पालन कर रहे हैं, तो आप देख सकते हैं कि onTouch घटना एक बार हर बार उपयोगकर्ता को छू लेती है स्क्रीन की तुलना में अधिक बढ़ जाता है। पता लगाने के लिए क्या कार्रवाई संभाला जा रहा है event.getAction() का प्रयोग करें। इस पर निर्भर करता है उपयोगकर्ता के व्यवहार ने घटना को उठाया। उदाहरण के लिए, स्क्रीन पर एक साधारण स्पर्श के लिए, onTouch ईवेंट ACTION_DOWN और ACTION_UP कार्यों के साथ दो बार आग लग जाएगा।एक स्पर्श और चाल के लिए, आपको चाल के आधार पर (नियंत्रण में, बाहर से अंदर, या इसके विपरीत) के आधार पर अलग-अलग क्रियाएं मिलेंगी। अधिक जानकारी के लिए MotionEvent देखें।

निम्नलिखित कोड है कि केवल ACTION_DOWN कार्रवाई संभालती स्वीकार किए जाते हैं जवाब का एक संशोधित संस्करण है:

manip.setOnTouchListener(new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     Layout layout = ((TextView) v).getLayout(); 
     int x = (int)event.getX(); 
     int y = (int)event.getY(); 
     if (layout!=null){ 
      int line = layout.getLineForVertical(y); 
      int offset = layout.getOffsetForHorizontal(line, x); 
      Log.v("index", ""+offset); 
      } 
    } 
    return true; 
    } 
}); 
+0

मुझसे ऊपर हटो। इस बिंदु पर, यह कुछ समय हो गया है क्योंकि मैंने एंड्रॉइड से संबंधित कुछ भी स्पर्श किया है, लेकिन ऐसा लगता है। :-) – Vinay

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