Hacer una vista de texto de hipervínculo en Android

Respuestas:

135

Prueba esto y cuéntame qué sucedió.

Usando código java:

TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));

Desde el nivel de API> = 24 en adelante Html.fromHtml(String source)está obsoleto en su lugar fromHtml(String, int), use ,

textView.setText(Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT));

O en el archivo XML de diseño, dentro de los atributos del widget TextView

android:autoLink="web"
android:linksClickable="true"
user370305
fuente
obtuve el resultado esperado. Gracias por tu respuesta
Srinivas
1
Si el texto del hipervínculo está presente en strings.xml, ninguna de las respuestas sugeridas funciona. Funciona de una manera muy extraña. Si configuro el texto directamente en el diseño xml, funciona, pero cuando configuro los datos de la vista de texto en el código Java, no funciona.
Velu
2
Solo para mencionar que si usa el código Java, debe eliminarlo android:autoLink="web"de XML. Tenía ambos y no funcionó.
Αntonis Papadakis
53

utilizar android:autoLink="web"en el xml de su TextView. Debería convertir automáticamente las URL en las que se puede hacer clic (si se encuentran en el texto)

waqaslam
fuente
14
También incluye android: linksClickable = "true"
Ajith Memana
@waqaslam en este caso donde ponemos un enlace.
Garg's
1
@ Garg's Es el texto que estableces en la vista de texto que puede contener hipervínculos
waqaslam
28

Todo probado y funcionando al 100%
Solución: a android:autoLink="web"
continuación se

muestra un ejemplo completo de diseño de muestra XML

    <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/txtLostpassword"
        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" />

Cadena en string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:[email protected]?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>
Shanewaj
fuente
3
No funciona si cambio esta línea> cleverfinger.com.au/user-guide/ </a> </ string > para un texto diferente como: Haga clic aquí
Musculaa
2
esto funciona solo si el texto contiene una URL completa como: www.something.com
Rahul Tiwari
7

Esto también se puede hacer usando la propiedad predeterminada de Textview

android:autoLink="email"
Rishabh Bhardwaj
fuente
5

Nota: - Html.fromHtml está obsoleto en Android N

Necesita verificar y soporte Android Ny versiones superiores de Android

                  //Set clickable true
                 tagHeading.setClickable(true);
                 
                  //Handlle click event
                  tagHeading.setMovementMethod(LinkMovementMethod.getInstance());

                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                    tagHeading.setText(Html.fromHtml("<a href='https://github.com/hiteshsahu'>https://github.com/hiteshsahu</a>", Html.FROM_HTML_MODE_LEGACY));
                } else {
                    tagHeading.setText(Html.fromHtml("<a href='https://github.com/hiteshsahu'>https://github.com/hiteshsahu</a>"));
                }
 

Alternativamente

No puede querer agregar mediante programación la marca autoLink en TextView.

android: autoLink = "web"

android: linksClickable = "true"

De esta manera no es necesario agregar <a href='somelink'>etiquetas.

Lo cual es una desventaja, si desea agregar hyperlinkun, textno puede hacerlo de esta manera. por ejemplo, no puedes hacer algo como esto: - [ hiteshsahu ] [1]

           <TextView
                android:id="@+id/tag_info"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tag_ll"
                android:layout_gravity="left"
                android:layout_margin="10dp"
                android:autoLink="web"
                android:linksClickable="true"
                android:text="https://github.com/hiteshsahu"
                android:textColor="@color/secondary_text" />

El resultado de ambos enfoques: -

https://github.com/hiteshsahu

Hitesh Sahu
fuente
1

Para la última versión de SDK fromHtmlestá en desuso Use debajo de la línea

String yourtext = "<a style='text-decoration:underline' href='http://www.sample.com'> Sample Website </a>";
    if (Build.VERSION.SDK_INT >= 24) {
        textView.setText(Html.fromHtml(yourtext, Html.FROM_HTML_MODE_LEGACY));
    } else {
        textView.setText(Html.fromHtml(yourtext));
    }
Rohan Pawar
fuente
0

He creado una función de extensión siguiente de una vista de texto.

@SuppressLint("SetTextI18n")
fun TextView.makeHyperLink(url: String) {
    text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml("<a href='${url}'>${text}</a>", Html.FROM_HTML_MODE_COMPACT)
    } else {
        Html.fromHtml("<a href='${url}'>${text}</a>")
    }
    movementMethod = LinkMovementMethod.getInstance()
    isClickable = true
}

y llamándolo así

tvTos.makeHyperLink(tos_url)

También puede pasar texto como parámetro.

Farhan
fuente