Saturday, December 22, 2012

Creating TextView with clickable links in Android

Did you ever want to display a TextView on Android which includes clickable HTML-links? I know I did. If you also wanted that, then I bet you struggled in finding a solution.

At first I thought, this can't be too hard, because I remember the TextView having a property linksClickable. But just setting this property to true won't work. Here are two methods how you can solve the problem described:


A) The almost-XML-only approach
If you want to work with XML-layouts only, you're out of luck. There's at least one line of code you have to write in your Java code-behind:
1. As usual, declare your TextView in XML and set the property android:linksClickable="true":
<TextView android:id="@+id/myTextView" android:linksClickable="true" text="@string/mylinks"/>

2. As a text, just refer to your @string-resource. Be careful to not use the CDATA in the resource. Just use the HTML anchor-tag(s):
<string name="mylinks">Please click <a href="http://android.com">here</a></string>

3. Finally, set the movementMethod in your code-behind file to the LinkMovementMethod's instance:
myTextView.setMovementMethod(LinkMovementMethod.getInstance());

4. Do not, I repeat, do not set the android:autoLink. Otherwise the anchor-tag(s) will not be displayed correctly!

B) The more-or-less-Java approach
If you prefer Java and don't want to touch XML (which I wouldn't recommend), here's what to do:
1. Create your TextView in Java (or get a reference from your XML-layout ;) and set the linksClickable property to true:
TextView myTextView = new TextView(context);
myTextView.setLinksClickable(true);

2. Again, create the text as a @string-resource (using resources is my recommendation, not a must ;), but this time make sure that the content of the string resource is set as CDATA:

<string name="mylinks"><![CDATA[Please click <a href="http://android.com">here</a>]]></string>

3. Set the text using the Html helper class to make sure the TextView actually contains HTML and not just plaintext:
myTextView.setText(Html.fromHtml(context.getString(R.id.mylinks)));

4. Now follow the steps 3 and 4 to make sure the links are actually clickable.

At the end I want to thank the StackExchange community that I was able to find a hint for the autoLink-problem and probably got inspired for the whole blog post ;)

Labels: , , , , , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

Links to this post:

Create a Link

<< Home