2011-01-20 11 views
25

मेरे पास टेक्स्टव्यू है जिसे मुझे लिंक करने की आवश्यकता है। यहाँ मैं क्या कर रहा हूँ है ..एंड्रॉइड: Linkify TextView

TextView text = (TextView) view.findViewById(R.id.name); 
text.setText("Android...Update from Android"); 
Pattern pattern = Pattern.compile("Android"); 
String scheme = "www.android.com"; 
Linkify.addLinks(text, pattern, scheme); 

पाठ-व्यू पाठ "एंड्रॉयड ... अद्यतन Android से" के साथ सही ढंग से प्रदर्शित किया जाता है, लेकिन मैं दो समस्याओं का सामना कर रहा हूँ।

1) मेरी टेक्स्ट स्ट्रिंग में स्ट्रिंग "एंड्रॉइड" के दो उदाहरण हैं। तो, दोनों पाठ को लिंक किया गया है। मैं केवल पहली घटना को लिंक करना चाहता हूं। मुझे इसे किस प्रकार करना चाहिए?

2) जब मैं लिंकफ़ी टेक्स्ट पर क्लिक करता हूं, तो यह ब्राउज़र खोलता है, लेकिन यूआरएल अजीब है। यूआरएल खोलने की कोशिश करता है वह "www.comandroid" है। मुझे नहीं पता कि यहाँ क्या गलत हो रहा है। यूआरएल में पाठ "एंड्रॉइड" बदल दिया जा रहा है। पाठ को लिंक करते समय मैं कुछ गलत कर रहा हूं।

किसी भी मदद की अत्यधिक सराहना की जाएगी।

+3

समस्या हल जैसा होगा। पहली समस्या का समाधान इयान लेस्ली द्वारा प्रदान किया गया उत्तर है। दूसरी समस्या का समाधान निम्नानुसार है। एपीआई "Linkify.addLinks" का व्यवहार ऐसा है कि, वह उस स्ट्रिंग को जोड़ता है जिसे आप यूआरएल के अंत तक जोड़ना चाहते हैं। पूर्व के लिए .. यदि आप "एंड्रॉइड" टेक्स्ट को "www.android.com" से जोड़ना चाहते हैं .. अंतिम यूआरएल "www.android.comAndroid" है जो मुझे चाहिए। इसलिए मैंने सार्वजनिक स्थिर अंतिम शून्य का उपयोग किया ऐडलिंक्स (टेक्स्ट व्यू टेक्स्ट, पैटर्न पी, स्ट्रिंग स्कीम, लिंकिफाइ.मैचफिल्टर मैचफिल्टर, लिंकिफा। ट्रांसफॉर्मफिल्टर ट्रांसफॉर्मफिल्टर) –

+0

ट्रांसफॉर्मफिल्टर ट्रांसफॉर्मफिल्टर = नया ट्रांसफॉर्मफिल्टर() {पब्लिक फाइनल स्ट्रिंग ट्रांसफॉर्म यूआरएल (फाइनल मैचर मैच, स्ट्रिंग यूआरएल) { रिटर्न ""; } }; एपीआई ट्रांसफॉर्मर एक शून्य स्ट्रिंग लौटाता है। तो मेरा अंतिम यूआरएल "www.android.com –

उत्तर

9

मुझे लिंकिफ़ाई के साथ बहुत अधिक अनुभव नहीं है। अब तक मैं जो करना चाहता हूं वह पाठ में यूआरएल को लिंक में बना देता है जिसे addLinks के एक अलग संस्करण द्वारा स्वचालित रूप से संभाला जाता है।

हालांकि नियमित अभिव्यक्ति आप पर "Android" मैच के लिए उपयोग कर रहे हैं केवल एक ही है कि आपके रेगुलर एक्सप्रेशन अदल-बदल करके स्ट्रिंग शुरू होता है मैच के लिए बदला जा सकता है:

Pattern pattern = Pattern.compile("^Android"); 

सूचना '^' के अलावा। यह स्ट्रिंग शुरू होने पर नियमित रूप से पैटर्न 'एंड्रॉइड' से मिलान करने के लिए नियमित अभिव्यक्ति मैचर को बताता है। अगर वह आपके तारों के साथ काम करेगा तो महान। यदि आपके पास अन्य मामले हैं, तो आप जिस शब्द को लिंक करना चाहते हैं वह लाइन की शुरुआत में नहीं है, आपको नियमित अभिव्यक्तियों का पता लगाने की आवश्यकता होगी। मैं और अधिक regular-expressions.info

+1

धन्यवाद। आपके उत्तर ने मेरी पहली समस्या हल की। ​​इसके लिए +1। –

5

जानने के लिए इस साइट सुझाव है कि आप तो आप ऐसा कर सकते हैं सभी url जो पाठ में शामिल खोलना चाहते हैं ..

  TextView textview=(TextView)findViewById(R.id.text); 

    textview.setText("Android....Update from android...www.android.com"); 
    Linkify.addLinks(textview, Linkify.WEB_URLS); 
    textview.setMovementMethod(LinkMovementMethod.getInstance()); 

यह सब यूआरएल के लिए काम कर सकते हैं।

17

मैं एक स्थिर विधि है कि इस बस करता बनाया:

/** 
* Add a link to the TextView which is given. 
* 
* @param textView the field containing the text 
* @param patternToMatch a regex pattern to put a link around 
* @param link the link to add 
*/ 
public static void addLink(TextView textView, String patternToMatch, 
     final String link) { 
    Linkify.TransformFilter filter = new Linkify.TransformFilter() { 
     @Override public String transformUrl(Matcher match, String url) { 
      return link; 
     } 
    }; 
    Linkify.addLinks(textView, Pattern.compile(patternToMatch), null, null, 
      filter); 
} 

और ओपी यह बस इस्तेमाल कर सकते हैं:

addLink(text, "^Android", "http://www.android.com"); 
+1

मैंने यह समझने की कोशिश करते हुए काफी समय बिताया कि यह केवल यह समझने के लिए क्यों नहीं काम करता है कि जब ऑटोलिंक सक्षम होता है काम नहीं करता है। जब "ऑटो-लिंकिंग" सक्षम होता है, तो सभी अतिरिक्त लिंकिफ़िक ऑपरेशंस को अनदेखा कर दिया जाता है। मैंने इस फ़ंक्शन को कॉल करने से पहले 'text.setAutoLinkMask (0);' कॉल करने को समाप्त कर दिया और यह दोनों कस्टम के साथ-साथ ऑटोलिंक भी किया मुझे उम्मीद है कि यह किसी अन्य समस्या का सामना करने वाले किसी और की मदद करता है। –

2

Shawns जवाब और SpunkerBaba की टिप्पणी से यहाँ मैं इस के साथ बाहर आ गए सहायक वर्ग यह आपके यूआरएल में जोड़े जा रहे परिवर्तनों के डबल संलग्न करने के मुद्दे को रोकता है।

package com.your.package; 

public class Linkify { 

    /** 
    * @param textView 
    *   textView who's text you want to change 
    * @param linkThis 
    *   a regex of what text to turn into a link 
    * @param toThis 
    *   the url you want to send them to 
    */ 
    public static void addLinks(TextView textView, String linkThis, String toThis) { 
     Pattern pattern = Pattern.compile(linkThis); 
     String scheme = toThis; 
     android.text.util.Linkify.addLinks(textView, pattern, scheme, new MatchFilter() { 
      @Override 
      public boolean acceptMatch(CharSequence s, int start, int end) { 
       return true; 
      } 
     }, new TransformFilter() { 

      @Override 
      public String transformUrl(Matcher match, String url) { 
       return ""; 
      } 
     }); 
    } 

} 

उपयोग:

Linkify.addLinks(profileTextView, "BlundellApps.com", "http://www.BlundellApps.com"); 
+0

पूरी तरह से काम करता है। मैं इसे कक्षा के बजाए फ़ंक्शन के रूप में उपयोग करता हूं। धन्यवाद! –

16

आसान तरीका एक्सएमएल लेआउट में autoLink डाल दिया है।

android:autoLink="web" 
0

समस्या हल हो गई। पहली समस्या का समाधान इयान लेस्ली द्वारा प्रदान किया गया उत्तर है। दूसरी समस्या का समाधान निम्नानुसार है। एपीआई "Linkify.addLinks" का व्यवहार ऐसा है कि, वह उस स्ट्रिंग को जोड़ता है जिसे आप यूआरएल के अंत तक जोड़ना चाहते हैं। पूर्व के लिए .. अगर आप "एंड्रॉइड" टेक्स्ट को "www.android.com" से जोड़ना चाहते हैं। अंतिम यूआरएल "www.android.comAndroid" है जो मुझे चाहिए।इसलिए मैंने

public static final void addLinks (TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) 
TransformFilter transformFilter = new TransformFilter() { 
public final String transformUrl(final Matcher match, String url) { 
return ""; 
} }; 

एपीआई ट्रांसफॉर्म फ़िल्टर एक शून्य स्ट्रिंग को वापस करता है। तो मेरी अंतिम URL "www.android.com" है

+0

क्या आप पूर्ण समाधान के साथ अपना उत्तर संपादित कर सकते हैं ?? – KJEjava48

+0

मूल्य क्या होना चाहिए LinkFilter और transformFilter में Linkify.addLinks (टेक्स्ट, पैटर्न, स्कीम, मैचफिल्टर, ट्रांसफॉर्म फ़िल्टर); – KJEjava48

0
TextView noteView = (TextView) findViewById(R.id.noteview); 
noteView.setText(someContent); 
Linkify.addLinks(noteView, Linkify.ALL); 
0

मुझे लगता है कि आप वास्तव में क्या जरूरत के रूप में सरल कुछ प्रकार है:

final TextView textView = ((BodyViewHolder) holder).textView; 
textView.setText(text); 
Linkify.addLinks(textView, Linkify.WEB_URLS); // I would do this only during view creation, btw. 

आप विशेष रूप से एक यूआरएल ट्रैक कर रहे हैं। कुछ लोगों को Linkigy.ALL उपयोग करने का सुझाव है, लेकिन आप यह नहीं चाहता:

public static final int ALL = WEB_URLS | EMAIL_ADDRESSES | PHONE_NUMBERS | MAP_ADDRESSES; 

इसके अलावा, अन्य लोगों को जोड़ने का सुझाव दे रहे हैं:

textview.setMovementMethod(LinkMovementMethod.getInstance()); 

लिंक नियमों को जोड़ने के बाद, लेकिन addLinks पहले से ही करता है कि इसके अंदर ;-)

चीयर्स!

0

लैम्ब्डा अभिव्यक्ति के साथ Koltin के लिए, यह इस

val pattern = Pattern.compile(link.title) 
Linkify.addLinks(view, pattern, null, null, { matcher, url -> link.href }) 
संबंधित मुद्दे