2011-01-25 22 views
48

Necesito poner un enlace en un TextView, tengo una cadena que contiene la etiqueta <a href="link">Text for link</a> y algún otro texto. El problema es que si ejecuto el proyecto, puedo ver el texto pero no se puede hacer clic en él. Intenté con la etiqueta <b> también para ver si funciona y parece que tampoco funciona.Enlaces en TextView

¿Cómo puedo hacer que esto funcione sin el uso de Linkify?

+0

Su pregunta no es muy clara. Además, ¿por qué no quieres usar linkify? – Qberticus

+0

tienes que decirle a tu aplicación qué hacer cuando haces clic en la vista de texto (al hacer clic en evento -> abrir el enlace –

+0

No, no quiero hacerlo con linkify – Cata

Respuesta

112

Gracias por su ayuda.

He logrado hacer esto, después de haber encontrado algunos ejemplos en las muestras de Android.

Aquí está el código:

textView.setText(Html.fromHtml(
      "<b>text3:</b> Text with a " + 
      "<a href=\"http://www.google.com\">link</a> " + 
      "created in the Java source code using HTML.")); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 

Espero que esta ayuda a otros ...

+1

Esta solución ignora cualquier número de teléfono y dirección de correo electrónico. Todavía tengo que encontrar una solución que maneje todo tipo de enlaces (web, teléfono, correo electrónico, ...) en el mismo 'TextView'. – dbm

+0

Tengo una vista de texto con datos de respuesta json. Esa respuesta contiene una descripción y una identificación de correo y número de teléfono. ¿Cómo puedo dar clic en evento para la identificación de correo y el número de móvil en esa vista de texto de Android? – Harsha

+0

Lo he hecho, pero ¿cómo sé si el usuario hizo clic en él para realizar un seguimiento? – JPM

28

Linkify es la clase que debe usar para crear enlaces. Por cierto, ¿cuál es el motivo para no usar Linkify?

Puede vincular todo el texto en su vista de texto para acciones como visitar un sitio web o llamar a un número de teléfono según el esquema. Android proporciona la forma más fácil de hacerlo. Considera el siguiente código.

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

Para crear enlaces personalizados, la misma clase Linkify ofrece varias opciones. Google ha publicado a blogpost on this.

+3

No funciona ... Solo puedo ver el texto. – Cata

+0

Gracias por la ayuda, ¿me pueden guiar cómo puedo eliminar el subrayado? – Jan

+0

Esto no funciona para enlaces como 'http://blah.com'. – EpicPandaForce

3

no puedo responder a su respuesta por alguna razón; Solo quería decir que puede omitir textView.setText y simplemente ponerlo en un recurso de cadena, y configurarlo usando android:text. Solo necesita mantener el textView.setMovementMethod(LinkMovementMethod.getInstance());; desafortunadamente android:linksClickable="true" por sí mismo no funciona.

40

Conseguir enlaces de trabajo de HTML es un poco complicado:

  1. Aplicar el texto a través de XML android:text="@string/… o por medio de setText() (ver otras respuestas)

  2. Uso textView.setMovementMethod(LinkMovementMethod.getInstance()) hacer clic en enlaces (ver otras respuestas)

  3. Do NO añadir android:autoLink="web" a que los recursos XML (sección TextView), de lo contrario, las etiquetas A no se representan correctamente y ya no se puede hacer clic.

Observación 1:
El OnClickListener puede ser útil, si su TextView contiene solamente un enlace y que desea activar la navegación, incluso si el usuario hace clic en su enlace a un lado, pero dentro de la TextView.

Observación 2:
android:linksClickable="true" todavía no funciona (a partir de Android 3.2), use p.  2 en lugar

+1

Este es el UNO. ¡Gracias! – iTurki

+0

¡Esto también me ayuda! Gracias. – prcaen

+2

No funciona si agrega la cadena de enlace del recurso en TextView xml. Solo funciona con 'setText (Html.fromHtml (getResources(). GetString (R.string.STRING_NAME))) para mí –

19

Uso

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

este es el método más fácil y funcionó bien – marson

20

no podía entenderlo, pero finalmente comenzó a trabajar cuando hice algo como:

tvTermsOfUse.setText(Html.fromHtml(getString(R.string.tv_terms_of_use_html))); 
Linkify.addLinks(tvTermsOfUse, Linkify.ALL); 
tvTermsOfUse.setMovementMethod(LinkMovementMethod.getInstance()); 

Ver texto se parece a:

<TextView 
    android:id="@+id/tv_terms_of_use" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:textAlignment="gravity" 
    android:gravity="center" 
    android:textColor="@android:color/white" 
    android:textSize="15sp" /> 

y string res:

<string name="tv_terms_of_use_html"> 
    <![CDATA[This is link to <a href="http://google.com/">Google</a>.]]> 
</string> 

parte Importante: El Linkify.addLinks se tiene que hacer antes de tvTermsOfUse.setMovementMethod, de lo contrario no funcionará.

No son necesarias otras configuraciones en XML.

Me tomó aproximadamente una hora resolverlo yo mismo, espero que ayude a alguien.

EDIT:

Según @rfellons comentar

Gracias. También para mí funciona ... PERO solo con

<uses-permission android:name="android.permission.INTERNET"/> 

en Manifest.xml. - rfellons 7 de septiembre a las 13:31

Asegúrate de comprobarlo también.

+2

Absoluty Right! ¡Gracias por el tiempo para escribirlo! ¡PERSONAS! LA RESPUESTA ESTÁ AQUÍ !!!! –

+0

¡Respuesta útil, ayúdame mucho, gracias! – validcat

+0

Funciona perfectamente, pero sin la precisión CDATA – DoubleYo

0

Esto funciona bastante registrado correctamente: (En las propiedades del TextView, en el interior del archivo XML)

android:autolink="web" 
1

la solución: Linkify.addLinks (chatText, Linkify.ALL);

0

Para añadir los enlaces de forma dinámica (recoger del servidor), esto funciona:

textView.setText(Html.fromHtml(
       "<a href=" + response.getLink() 
         + ">" + context.getString(R.string.link_from_server) + "</a> ")); 

y en XML añadir lo siguiente:

android:linksClickable="true" 

Si su strings.xml tiene esta:

<string name="link_from_server">Dynamic Link</string> 

Esto agregará "Enlace dinámico" a su vista de texto y si toca esto, irá al enlace provisto por su servidor.