2011-01-20 13 views
25

Tengo textview que necesito vincular. Esto es lo que estoy haciendo ..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); 

El comunicado en el punto de vista se visualiza correctamente con el texto "... Android actualización de Android", pero yo estoy frente a dos problemas.

1) Mi cadena de texto tiene dos instancias de la cadena "Android". Entonces, ambos textos están vinculados. Solo quiero vincular la primera aparición. ¿Cómo debo hacerlo?

2) Cuando hago clic en el texto linkfy, abre el navegador, pero la URL es extraña. La URL que intenta abrir es "www.comandroid". No sé qué está yendo mal aquí. El texto "android" en la URL está siendo reemplazado. ¿Estoy haciendo algo mal cuando enlace el texto?

Cualquier ayuda será muy apreciada.

+3

Problema resuelto. La solución al primer problema es la respuesta proporcionada por Ian Leslie. La solución al segundo problema es la siguiente. El comportamiento de la API "Linkify.addLinks" es tal que, agrega la cadena que desea vincular al final de la url. Por ejemplo ... si desea vincular el texto "Android" con "www.android.com" ... la URL final es "www.android.comAndroid", que no es lo que necesitaba. Así que utilicé public static the final void addLinks (TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) –

+0

TransformFilter transformFilter = new TransformFilter() {public final String transformUrl (coincidencia final de Matcher, url String) { return ""; } }; La api transformFilter devuelve una cadena nula. Así que mi url final es "www.android.com –

Respuesta

9

No tengo mucha experiencia con Linkify. Hasta ahora, todo lo que he querido hacer es convertir URL en el texto en enlaces, que se maneja automáticamente con una versión diferente de addLinks.

Sin embargo, la expresión regular que está utilizando para que coincida con el "androide" se puede cambiar para solo la que comienza la cadena mediante la deformación de la expresión regular:

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

Aviso la adición de '^'. Esto le dice al emparejador de expresiones regulares que solo coincida con el patrón 'Android' cuando inicia la cadena. Si eso funciona con tus cuerdas, entonces genial. Si tiene otros casos en los que la palabra que desea vincular no está al principio de la línea, necesitará explorar algunas expresiones regulares. Recomiendo este sitio para aprender más regular-expressions.info

+1

Gracias. Su respuesta resolvió mi primer problema. +1 por ello. –

5

Si desea abrir todas las URL que contiene en el texto a continuación, puede hacer esto ..

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

Es posible que funcione para todas las URLs.

17

He creado un método estático que hace esto simplemente:

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

Y la OP podría utilizar de manera simple:

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

Pasé bastante tiempo tratando de entender por qué esto no funciona solo para darme cuenta de que cuando se habilita el enlace automático esto no funciona. Cuando "auto-linking" está habilitado, se ignoran todas las operaciones adicionales de Linkify. Terminé llamando a 'text.setAutoLinkMask (0);' antes de llamar a esta función y lo hice tanto autolink como esta costumbre linkify. Espero que esto ayude a cualquier persona que enfrente el mismo problema. –

2

Aquí de respuesta Shawns y comentario de SpunkerBaba he salido con este clase de ayuda. Esto evita que el agregado doble de lo que está cambiando se agregue a su 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

Funciona perfectamente. Solo uso esto como una función en lugar de una clase. Gracias! –

16

La manera más fácil es puesto en la disposición autoLink XML.

android:autoLink="web" 
0

Problema resuelto. La solución al primer problema es la respuesta proporcionada por Ian Leslie. La solución al segundo problema es la siguiente. El comportamiento de la API "Linkify.addLinks" es tal que, agrega la cadena que desea vincular al final de la url. Por ejemplo, si desea vincular el texto "Android" con "www.android.com". La URL final es "www.android.comAndroid", que no es lo que necesitaba.Así que utilicé

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

La api transformFilter devuelve una cadena nula. Así que mi URL final es "www.android.com"

+0

¿Puedes editar tu respuesta con la solución completa? – KJEjava48

+0

¿Cuál debería ser el valor? para matchFilter y transformFilter en Linkify.addLinks (texto, patrón, esquema, matchFilter, transformFilter); – KJEjava48

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

Creo que lo que realmente necesita es algo tan simple como:

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

realiza un seguimiento de una dirección URL específica. Algunas personas sugieren usar Linkigy.ALL, pero no desea que esto:

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

Además, otras personas están sugiriendo añadiendo:

textview.setMovementMethod(LinkMovementMethod.getInstance()); 

después de añadir las reglas de enlace, pero addLinks ya hace que, en su interior ;-)

¡Salud!

0

Para Koltin con la expresión lambda, que sería como este

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