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


Tengo el siguiente TextView definido:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

dónde @string/txtCredits es un recurso de cadena que contiene <a href="some site">Link text</a>.

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:

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

Pero esto hace:

<string name="txtCredits">www.google.com</string>

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


819
2018-04-29 01:41


origen


Respuestas:


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

Link.java:

    // text2 has links specified by putting <a> 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.

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txtCredits"/>

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

Importante: No te olvides de eliminar autoLink="web" si estás llamando setMovementMethod().


1088
2018-04-30 18:18



Estoy usando solo 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.


459
2018-04-29 07:13



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:
  • Algún texto <a href="http://www.google.com">http://www.google.com</a>
  • Algún texto http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); funcionará con lo siguiente (se resaltará y se podrá hacer clic):
  • Algún texto <a href="http://www.google.com">http://www.google.com</a>
  • Algún texto http://www.google.com
  • Algún texto <a href="http://www.google.com">Go to Google</a>

Tenga en cuenta que la tercera opción tiene un hipervínculo, pero la descripción del enlace (la parte entre las etiquetas) no es un enlace. android:autoLink="web" hace NO trabajar 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 el uso view.setMovementMethod(LinkMovementMethod.getInstance()); en tu código y asegúrate de no tener android:autoLink="web" en su diseño XML si lo desea todas enlaces para hacer clic.


294
2017-12-17 23:45



Las soluciones anteriores no funcionaron para mí, pero sí lo hizo (y parece un poco más limpio).
Primero, en el recurso de cadena, defina sus galones de apertura de etiqueta usando la codificación de entidad HTML, es decir:

&lt;a href="http://www.google.com">Google&lt;/a>

y no:

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

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

Entonces (como se sugiere aquí) configure 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.


84
2018-04-12 13:58



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

  • agregar una cadena similar a HTML de recursos:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • agregue su vista al diseño sin ninguna configuración específica del enlace:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
    
  • 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 etiquetas html) me resulta muy engañoso ...


56
2018-06-29 10:10



utilicé esto simplemente

Linkify.addLinks(TextView, Linkify.ALL);

hace que los enlaces sean clicables aquí


56
2018-03-26 13:00



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

layout.xml muestra

    <TextView
        android:id="@+id/txtLostpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="email"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/lostpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/txtDefaultpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="web"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/defaultpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>

41
2018-06-18 06:14