91

I want to make a link for a textview text like Google. Is there anyway to make link like this. (i.e) When clicking on the word Google it should open the appropriate link. Any ideas are welcome.

Rahul Tiwari
  • 6,851
  • 3
  • 49
  • 78
Srinivas
  • 1,405
  • 2
  • 13
  • 15

7 Answers7

152

Try this, and let me know what happen..

Using java code:

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

From API level >= 24 onwards Html.fromHtml(String source) is deprecated instead use fromHtml(String, int),

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

Or in layout xml file, inside your TextView widget attributes

android:autoLink="web"
android:linksClickable="true"
user370305
  • 108,599
  • 23
  • 164
  • 151
  • 1
    i got the expected output. Thanks for ur answer – Srinivas Feb 15 '12 at 09:43
  • 4
    If the hyperlink text is present in strings.xml then none of the suggested answers are working. It works in very weird way. If I set the text directly in layout xml it works, but when I set the textview data in java code it doesn't work. – AndroidDev Dec 10 '19 at 05:43
  • 4
    Just to mention that if you use the Java code you need to remove `android:autoLink="web"` from XML. I had both and it didn't work. – Αntonis Papadakis Mar 28 '20 at 21:30
  • 2
    @Velu you must surround the string with `<![CDATA[string]>>` where string is your whole string text with a ulr. Was trying to fix this for an hour... – Vojtěch Hořánek Sep 01 '21 at 12:17
63

use android:autoLink="web" in your TextView's xml. It should automatically convert urls click-able (if found in text)

waqaslam
  • 67,549
  • 16
  • 165
  • 178
31

All tested and working 100%
Solution: android:autoLink="web"
below is a complete example

Sample Layout 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" />

String in 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>
Ravindra Kushwaha
  • 7,846
  • 14
  • 53
  • 103
Shanewaj
  • 2,078
  • 1
  • 20
  • 16
7

This can also be done by using the default property of Textview

android:autoLink="email"
Rishabh Bhardwaj
  • 832
  • 8
  • 20
5

Note :- Html.fromHtml is deprecated in Android N

You need to do check and support Android N and higher versions of 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>"));
                }
 

Alternatively

You can don't want to id programmatically add autoLink flag on TextView.

android:autoLink="web"

android:linksClickable="true"

This way You don't need to add <a href='somelink'> tags.

Which is a disadvantage, if you want to add hyperlink on a text you can't do it this way. eg you can't do something like this:- [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" />

The result from both approach:-

https://github.com/hiteshsahu

Community
  • 1
  • 1
Hitesh Sahu
  • 41,955
  • 17
  • 205
  • 154
1

For Latest version of SDK fromHtml is deprecated Use below line

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
  • 1,875
  • 22
  • 40
1

I have made a following extension function of a textview.

@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
}

and calling it like this

tvTos.makeHyperLink(tos_url)

You can also pass text as a parameter.

Farhan
  • 3,162
  • 3
  • 25
  • 17