¿Cómo puedo hacer enlaces en un TextView en el que se puede hacer clic?

Tengo el siguiente TextView definido:

 

donde @string/txtCredits es un recurso de cadena que contiene Link text .

Android destaca los enlaces en TextView, pero no responden a los clics. ¿Puede alguien decirme qué estoy haciendo mal? ¿Debo configurar un onClickListener para TextView en mi actividad por algo tan simple como esto?

Parece que tiene que ver con la forma en que defino mi recurso de cadena. Esto no funciona:

 Google 

Pero esto hace:

 www.google.com 

Lo cual es un fastidio porque prefiero mostrar un enlace de texto que mostrar la URL completa.

Enterrado en las demos de API, encontré la solución a mi problema:

Link.java:

  // text2 has links specified by putting  tags in the string // resource. By default these links will appear but not // respond to user input. To make them active, you need to // call setMovementMethod() on the TextView object. TextView t2 = (TextView) findViewById(R.id.text2); t2.setMovementMethod(LinkMovementMethod.getInstance()); 

Eliminé la mayoría de los atributos en mi TextView para que coincida con lo que estaba en la demostración.

  

Eso lo resolvió Es bastante difícil de descubrir y corregir.

Importante : no olvides eliminar autoLink="web" si estás llamando a setMovementMethod() .

Solo estoy usando android:autoLink="web" y funciona bien. Un clic en el enlace abre el navegador y muestra la página correcta.

Una cosa que podría adivinar es que alguna otra vista está encima del enlace. Algo que es transparente llena al padre pero no muestra nada sobre el enlace. En este caso, el clic va a esta vista en lugar de al enlace.

Después de pasar algo de tiempo con esto, he encontrado que:

  • android:autoLink="web" funciona si tiene enlaces completos en su HTML. Lo siguiente se resaltará en azul y se puede hacer clic:
  • view.setMovementMethod(LinkMovementMethod.getInstance()); funcionará con lo siguiente (se resaltará y se podrá hacer clic):

Tenga en cuenta que la tercera opción tiene un hipervínculo, pero la descripción del enlace (la parte entre las tags) no es un enlace. android:autoLink="web" NO funciona con tales enlaces.

  • android:autoLink="web" si se establece en XML anulará view.setMovementMethod(LinkMovementMethod.getInstance()); (es decir, se resaltarán los enlaces del tercer tipo, pero no se puede hacer clic).

La moraleja de la historia es use view.setMovementMethod(LinkMovementMethod.getInstance()); en su código y asegúrese de no tener android:autoLink="web" en su diseño XML si desea que se pueda hacer clic en todos los enlaces.

Las soluciones anteriores no funcionaron para mí, pero sí lo hizo (y parece un poco más limpio).
En primer lugar, en el recurso de cadena, defina los galones de apertura de etiqueta utilizando la encoding de entidad HTML, es decir:

 <a href="http://www.google.com">Google</a> 

y no:

 Google 

En general, codifica todos los galones en la cadena de esa manera. Por cierto, el enlace debe comenzar con http://

Luego (como se sugiere aquí ) establezca esta opción en su TextView:

  android:linksClickable="true" 

Finalmente, en el código, hazlo:

 ((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance()); ((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links))); 

Eso es todo, no se requieren expresiones regulares u otros hacks manuales.

utilicé esto simplemente

 Linkify.addLinks(TextView, Linkify.ALL); 

hace que los enlaces se puedan hacer clic aquí

Si desea agregar un enlace similar al HTML, todo lo que necesita hacer es:

  • agregar una cadena similar a HTML de recursos:

      Google 
  • agregue su vista al diseño sin ninguna configuración específica del enlace:

      ` 
  • agrega MovementMethod apropiado programáticamente a tu TextView:

      mLink = (TextView) findViewById(R.id.link); if (mLink != null) { mLink.setMovementMethod(LinkMovementMethod.getInstance()); } 

¡Eso es! Y sí, tener opciones como “autoLink” y “linksClickable” trabajando únicamente en enlaces explícitos (no incluidos en las tags html) me resulta muy engañoso …

TextView esta línea a TextView : android:autoLink="web"
A continuación se muestra un ejemplo de uso en un archivo de diseño.

Muestra layout.xml

    

string.xml

 If you lost your password please contact support@cleverfinger.com.au User Guide http://www.cleverfinger.com.au/user-guide/ 

Espero que esto ayude;

 String value = "Visit my blog mysite View myactivity callback"; TextView text = (TextView) findViewById(R.id.text); text.setText(Html.fromHtml(value)); text.setMovementMethod(LinkMovementMethod.getInstance()); 

Solo lo que necesita agregar esto en la vista de texto en xml

  

Richard, la próxima vez, debería agregar este código en TextView en el formato XML en su lugar.

 android:autoLink="all" 

Esto debería ser así.

   

No necesita usar este código ( t2.setMovementMethod(LinkMovementMethod.getInstance()); ) para hacer que el enlace se pueda hacer clic.

Además, esta es la verdad: siempre que configure autoLink y los enlaces Click , no olvide agregar esto en el archivo String.xml para que el enlace haga clic.

 Google 

mediante el uso de linkify : Linkify toma un fragmento de texto y una expresión regular y convierte todas las coincidencias de expresiones regulares en el texto en enlaces clicables

 TextView textView = (TextView) findViewById(R.id.textView); textView.setText("http://www.domain.com"); Linkify.addLinks(textView, Linkify.WEB_URLS); 

No olvides

 import android.widget.TextView; 

Lo más fácil que funcionó para mí es usar Linkify

 TextView txt_Message = (TextView) view.findViewById(R.id.txt_message); txt_Message.setText("This is link https://www.google.co.in/"); Linkify.addLinks(txt_Message, Linkify.WEB_URLS); 

y detectará automáticamente las URL web del texto en la vista de texto.

Me di cuenta de que el uso de android:autoLink="web" tanto

  

funcionó bien para las URL pero como tenía una dirección de correo electrónico y un número de teléfono que también quería vincular, terminé usando esta línea de android:autoLink="all" como este

  

Y funcionó como un encanto.

Aquí hay una línea de código de Android para hacer que el teléfono y la url sean seleccionables desde textView sin importar qué es cadena y qué datos hay. No necesita usar ninguna etiqueta HTML para esto.

 TextView textView = (TextView)findViewById(R.id.textView1); textView.setText("some url is www.google.com phone 7504567890 another url lkgndflg.com "); // Makes the textView's Phone and URL (hyperlink) select and go. Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS); 

Asegúrese de no utilizar setAutoLinkMask(Linkify.ALL) cuando use setMovementMethod(LinkMovementMethod.getInstance()) y Html.fromHTML() en enlaces HTML formateados correctamente (por ejemplo, Google ).

Utilizar esta…

 TextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/")); startActivity(in); } }); 

y agregar permiso en el archivo de manifiesto

  

Solo necesitas esto:

 android:autoLink="web" 

Inserte esta línea en TextView, que se puede hacer clic con referencia a la web. Dirección URL configurada como texto de este TextView.

Ejemplo:

   

La respuesta aceptada es correcta, PERO significará que ya no se podrá hacer clic en los números de teléfono, mapas, direcciones de correo electrónico y enlaces regulares, por ejemplo, http://google.com sin tags href, ya que no puede tener autolink en el xml.

La única solución completa en la que se puede hacer clic en TODO lo que he encontrado es la siguiente:

 Spanned text = Html.fromHtml(myString); URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class); SpannableString buffer = new SpannableString(text); Linkify.addLinks(buffer, Linkify.ALL); for (URLSpan span : currentSpans) { int end = text.getSpanEnd(span); int start = text.getSpanStart(span); buffer.setSpan(span, start, end, 0); } textView.setText(buffer); textView.setMovementMethod(LinkMovementMethod.getInstance()); 

Y el TextView NO debe tener android:autolink . No hay necesidad de android:linksClickable="true" tampoco; es cierto por defecto.

Lo siguiente debería funcionar para cualquiera que esté buscando una combinación de texto e hipervínculo dentro de una aplicación de Android.

En string.xml :

 Looking for the regular Zesteve App? Get it here  

Ahora puedes utilizar esta string en cualquier View dada como esta:

  

Ahora, en tu Actividad o Fragmento, haz lo siguiente:

 TextView getapp =(TextView) findViewById(R.id.getapp); getapp.setMovementMethod(LinkMovementMethod.getInstance()); 

Por ahora, no necesita configurar android:autoLink="web" o android:linksClickable="true" utilizando este enfoque.

Espero que esto te sea útil.

Así es como resolví enlaces seleccionables y Visibles en un TextView (por código)

 private void setAsLink(TextView view, String url){ Pattern pattern = Pattern.compile(url); Linkify.addLinks(view, pattern, "http://"); view.setText(Html.fromHtml("http://"+url+"")); } 

Use el siguiente código:

 String html = "Your Domain Name" TextView textview = (TextView) findViewById(R.id.your_textview_id); textview.setMovementMethod(LinkMovementMethod.getInstance()); textview.setText(Html.fromHtml(html)); 

La razón por la que está teniendo el problema es que solo intenta hacer coincidir direcciones “desnudas”. cosas como “www.google.com” o ” http://www.google.com “.

Ejecutar su texto a través de Html.fromHtml () debería hacer el truco. Tienes que hacerlo programáticamente, pero funciona.

El teléfono Autolink no funcionó para mí. Lo siguiente funcionó como un encanto,

 TextView tv = (TextView) findViewById(R.id.emergencynos); String html2="

Fire - 997 "; tv.append(Html.fromHtml(html2)); tv.setMovementMethod(LinkMovementMethod.getInstance());

Agregue CDATA a su recurso de cadena

Strings.xml

 < ![CDATA[Google]]> 

No sé si vale la pena agregar otra respuesta, pero por las dudas …

Tuve que buscar esto en un par de lugares, pero finalmente conseguí que esta versión del código funcionara.

strings.xml:

 <a href="http://www.google.com">link text1</a> <a href="http://www.google.com">link text2</a> 

myactivity.xml:

   

myactivty.java (en onCreate ()):

 TextView tv1 = (TextView)findViewById(R.id.textview1); TextView tv2 = (TextView)findViewById(R.id.textview2); tv1.setText(Html.fromHtml(getResources().getString(R.string.name1))); tv2.setText(Html.fromHtml(getResources().getString(R.string.name2))); tv1.setMovementMethod(LinkMovementMethod.getInstance()); tv2.setMovementMethod(LinkMovementMethod.getInstance()); 

Esto creará dos hipervínculos que se pueden hacer clic con el texto del link text1 y el link text2 que redirigen al usuario a google.

Si utiliza TextView basado en XML, para su requerimiento debe hacer solo dos cosas:

  1. Identifique su enlace en la cadena, como “esta es mi página web”. Puede agregarlo en xml o en el código.

  2. En el xml que tiene TextView, agregue estos:

 android:linksClickable="true" android:autoLink="web" 

Utilizo el enlace automático para “subrayar automáticamente” el texto, pero acabo de hacer un “onClick” que lo gestiona. (Me encontré con este problema yo mismo)

   public void twitter (View view) { try { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech")); startActivity(browserIntent); } finally { } } 

No requiere ningún permiso, ya que está pasando el bash a las aplicaciones que administran esos recursos (navegador IE).

Esto fue lo que funcionó para mí. Buena suerte.

Mi código era así:

  

Mi código de Java era así:

 /*TextView action*/ TextView textView = (TextView) findViewById(R.id.link); textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(LoginActivity.this,forgot.class)); } }); 

Esto simplemente señala el enlace a otra actividad. Pero ese enlace se puede hacer clic y funciona sin problemas. Probado en Android Studio 1.5 (Vista previa)

[Tested in Pre-lollipop as well as in Lollipop and above]

Puede obtener su cadena HTML desde el back-end o desde sus archivos de recursos. Si coloca el texto como una cadena de recursos, asegúrese de agregar la etiqueta CDATA :

 ![CDATA[...Link Title ...]] 

Luego, en el código, necesita obtener la cadena y asignarla como HTML y establecer un método de movimiento de enlace:

 String yourText = getString(R.string.your_text); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT)); } else { textView.setText(Html.fromHtml(yourText)); } try { subtext.setMovementMethod(LinkMovementMethod.getInstance()); } catch (Exception e) { //This code seems to crash in some Samsung devices. //You can handle this edge case base on your needs. }