2011-01-20 18 views
25

Ho una vista testuale che ho bisogno di collegare. Ecco quello che sto facendo ..Android: 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); 

Il testo appena catturata viene visualizzata correttamente con il testo "Android ... Aggiornamento da Android", ma sto affrontando due problemi.

1) La mia stringa di testo ha due istanze della stringa "Android". Quindi, entrambi i testi sono collegati. Voglio solo la prima occorrenza da collegare. Come dovrei farlo?

2) Quando faccio clic sul testo linkfy, si apre il browser, ma l'URL è strano. L'URL che tenta di aprire è "www.comandroid". Non so che cosa sta andando storto qui. Il testo "android" nell'URL è stato sostituito. Sto facendo qualcosa di sbagliato quando Linknifying il testo.

Qualsiasi aiuto sarà molto apprezzato.

+3

Problema risolto. La soluzione al primo problema è la risposta fornita da Ian Leslie. La soluzione al secondo problema è la seguente. Il comportamento dell'API "Linkify.addLinks" è tale che aggiunge la stringa che si desidera collegare alla fine dell'URL. Per esempio, se si desidera collegare il testo "Android" con "www.android.com" .. l'URL finale è "www.android.comAndroid", che non è quello che mi serviva. Quindi ho usato il vuoto statico pubblico addLinks (testo TextView, Pattern p, Schema di stringhe, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) –

+0

TransformFilter transformFilter = new TransformFilter() {transform stringUrl finale pubblico (match Matcher finale, URL stringa) { return ""; } }; l'api transformFilter restituisce una stringa nulla. Quindi il mio ultimo URL è "www.android.com –

risposta

9

Non ho molta esperienza con Linkify. Finora tutto quello che volevo fare è rendere gli URL nel testo in collegamenti che vengono gestiti automaticamente da una versione diversa di addLinks.

Tuttavia l'espressione regolare che si sta utilizzando per abbinare su "Android" può essere modificata per corrispondere solo quella che inizia la stringa modificando l'espressione regolare:

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

Avviso l'aggiunta di '^'. Questo dice al matcher dell'espressione regolare di abbinare solo il pattern 'Android' quando inizia la stringa. Se questo funzionerà con le tue corde allora è grandioso. Se hai altri casi in cui la parola che vuoi collegare non è all'inizio della riga, dovrai esplorare altre espressioni regolari. Vi consiglio questo sito per saperne di più regular-expressions.info

+1

Grazie, la tua risposta ha risolto il mio primo problema +1 per questo –

5

Se si desidera aprire tutti gli URL che contengono nel testo, allora si può fare questo ..

  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()); 

può funzionare per tutti gli URL.

17

ho creato un metodo statico che fa questo semplicemente:

/** 
* 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); 
} 

E il PO potrebbe usare semplicemente:

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

Ho passato un po 'di tempo a cercare di capire perché questo non funziona solo per capire che quando l'autolink è abilitato questo Quando "auto-linking" è abilitato, tutte le operazioni aggiuntive di Linkify vengono ignorate Ho finito per chiamare 'text.setAutoLinkMask (0);' prima di chiamare questa funzione ha eseguito sia l'autolink che questa custom Spero che questo aiuti chiunque altro che si trova ad affrontare lo stesso problema –

2

Qui da Shawns risposta e commento di SpunkerBaba sono venuto fuori con questo classe di aiuto. Ciò interrompe il problema della doppia aggiunta di quello che stai modificando che viene aggiunto al tuo URL.

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 ""; 
      } 
     }); 
    } 

} 

Uso:

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

Funziona perfettamente, lo uso come funzione invece di una classe, grazie! –

16

Il modo più semplice è messo autoLink nel layout XML.

android:autoLink="web" 
0

Problema risolto. La soluzione al primo problema è la risposta fornita da Ian Leslie. La soluzione al secondo problema è la seguente. Il comportamento dell'API "Linkify.addLinks" è tale che aggiunge la stringa che si desidera collegare alla fine dell'URL. Ad esempio, se si desidera collegare il testo "Android" con "www.android.com". L'URL finale è "www.android.comAndroid" che non è quello di cui avevo bisogno.Quindi ho usato

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 ""; 
} }; 

l'api transformFilter restituisce una stringa nulla. Quindi il mio URL finale è "www.android.com"

+0

Puoi modificare la tua risposta con la soluzione completa – KJEjava48

+0

Quale dovrebbe essere il valore per matchFilter e transformFilter in Linkify.addLinks (testo, modello, schema, matchFilter, transformFilter); – KJEjava48

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

Penso che quello che si ha realmente bisogno è qualcosa di semplice come:

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

si sta monitorando un URL specifico. Alcune persone suggeriscono di usare Linkigy.ALL, ma non si vuole questo:

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

Inoltre, altre persone sono suggerendo aggiungendo:

textview.setMovementMethod(LinkMovementMethod.getInstance()); 

dopo aver aggiunto le regole di collegamento, ma addLinks fa già che nel il suo interno ;-)

Cheers!

0

Per Koltin con espressione lambda, sarebbe come questo

val pattern = Pattern.compile(link.title) 
Linkify.addLinks(view, pattern, null, null, { matcher, url -> link.href })