2013-02-13 22 views
22

मुझे TextView होना चाहिए जो दोनों चयन योग्य और लिंक किए गए हैं। जब मैं दोनों करता हूं तो मैं चुनिंदा पाठ के साथ समाप्त होता हूं लेकिन लिंक पर क्लिक नहीं किया जा सकता है।टेक्स्ट व्यू जो लिंक और चयन योग्य है?

संपादित करें:

मैं मैं क्या संघर्ष के साथ व्याख्या करने के लिए कोड दिखाएंगे:

TextView textView = view.findViewById(R.id.mytext); 
    textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
    Linkify.addLinks(textView, Linkify.ALL); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     textView.setTextIsSelectable(true); 
    } 
+0

आप क्या कर रहे हैं जो काम नहीं कर रहा है? क्या इसे केवल काम को जोड़ने की कोशिश कर रहा है? –

+0

जब मैं इसे लिंक करता हूं तो मैं यूआरएल और फोन पर क्लिक कर सकता हूं। लेकिन जब मैं इसे चुनने योग्य चयन करता हूं तो अब – pixel

उत्तर

15

आप अपने TextView एक्सएमएल कोड पर इस जोड़ने की कोशिश की थी?

<TextView 
    ... 
    android:autoLink="all" 
    android:textIsSelectable="true" /> 

मैंने इसे अपने कोड पर आजमाया है और मैं वेब/मेल पर कॉल/सर्फ कर सकता हूं और सभी टेक्स्ट भी चुन सकता हूं।

+0

संभव नहीं है, इसलिए यह पहले तैयार 'टेक्स्ट व्यू' (जैसे 'textView = inflater.inflate (R.layout.linkify_text_view, null)' को बढ़ाने के बारे में है) क्योंकि यह जोड़ते समय ठीक से काम नहीं करता है यह कोड के माध्यम से। यह http: // commonsware भी देखें।com/ब्लॉग/2013/10/23/linkify-autolink-need-custom-urlspan.html – Stan

2

समस्या एंड्रॉइड के TextView में है। Linkify.addLinks() पर कॉल करने से TextView में ऑटोलिंकमास्क नहीं बदलेगा। मुझे लगता है कि यह एक एंड्रॉइड बग है कि वे mAutoLinkMask की जांच करते हैं। तो यदि आप android:autoLinkxml फ़ाइल में सेट करते हैं, या setAutoLinkMask() को गैर 0 मान पर कॉल करते हैं, तो यह काम करेगा।

FYI करें

, TextView के स्रोत कोड:

  if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) { 
      // The LinkMovementMethod which should handle taps on links has not been installed 
      // on non editable text that support text selection. 
      // We reproduce its behavior here to open links for these. 
      ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(), 
        getSelectionEnd(), ClickableSpan.class); 

      if (links.length > 0) { 
       links[0].onClick(this); 
       handled = true; 
      } 
     } 
13

autoLink विशेषता एक कष्टप्रद बग है: यदि आप फोन नंबर पर अपने उदाहरण में क्लिक करें, फिर वापस लौटने और दूसरा यूआरएल लिंक पर क्लिक करें - यह फोन नंबर फिर से खुल जाएगा। यह विशेषता कई लिंक के साथ इतना बुरा काम करता है, कि मैं अपने ही वर्ग को लागू किया है, यहाँ आप एक्सएमएल-लेआउट में मेरी ClickableLinksTextView वर्ग द्वारा अपने TextView वर्ग की जगह और कोड बदल सकते हैं Github ClickableLinksTextView.java

अपने उदाहरण में पर कड़ी है इस तरह:

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext); 
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
Linkify.addLinks(textView, Linkify.ALL); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    textView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 
    textView.setTextIsSelectable(true); 
    // the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0); 
} 

अपने प्रश्न में इस मुद्दे का मूल कारण यह है कि LinkMovementMethod वर्ग और textIsSelectable विशेषता बिल्कुल संगत नहीं हैं, यहां तक ​​कि Android ओएस डेवलपर्स the Android OS source code में यह स्वीकार करते है।

पाठ चयन का समर्थन करने वाले पाठ के लिए आंदोलन विधि को न बदलें क्योंकि यह मनमाने ढंग से कर्सर विस्थापन को रोक देगा।

पाठ दृश्य चयन है, तो केवल 2 सही आंदोलन विधि मूल्यों null और ArrowKeyMovementMethod हैं। यही कारण है कि मैंने अपने उदाहरण में स्पष्ट रूप से ArrowKeyMovementMethod सेट किया है, क्योंकि Linkify.addLinks गलत आंदोलन विधि सेट करता है और मुझे इसे वापस करना चाहिए।

ऑटोलिंक विशेषता की बग के रूप में, ऐसा इसलिए है क्योंकि एंड्रॉइड डेवलपर्स ने लिंक पहचान को सही तरीके से कॉपी नहीं किया है। आप @cheng यांग के जवाब में कोड उदाहरण देख सकते हैं, कोड केवल पहला लिंक लेता है इससे कोई फर्क नहीं पड़ता कि आपके पास कितने हैं।

+0

textView.setMovementMethod (ArrowKeyMovementMethod.getInstance()); मुझे यह मेरे लिए काम करने के लिए जरूरी है। –

+0

इसे अपने स्वयं के यूआरएलस्पैन के साथ एक साथ इस्तेमाल किया जाता है जो अन्य कस्टम स्पैन के साथ मिश्रित होता है और आपकी कक्षा बहुत अच्छी काम करती है। इसे उपलब्ध कराने के लिए धन्यवाद! बीटीडब्लू को स्पष्ट रूप से ClickableLinksTextView पर डालने की आवश्यकता नहीं है क्योंकि टेक्स्ट व्यू एपीआई छूटा नहीं गया है। – Makibo

+0

बहुत बहुत धन्यवाद यह बहुत मदद करता है –