Zane Claes Zane Claes - 10 months ago 129
Android Question

Android TextView with Clickable Links: how to capture clicks?

I have a TextView which is rendering basic HTML, containing 2+ links. I need to capture clicks on the links and open the links -- in my own internal WebView (not in the default browser.)

The most common method to handle link rendering seems to be like this:

String str_links = "<a href=''>Google</a><br /><a href=''>Facebook</a>";
text_view.setText( Html.fromHtml( str_links ) );

However, this causes the links to open in the default internal web browser (showing the "Complete Action Using..." dialog).

I tried implementing a onClickListener, which properly gets triggered when the link is clicked, but I don't know how to determine WHICH link was clicked...

text_view.setOnClickListener(new OnClickListener(){

public void onClick(View v) {
// what now...?


Alternatively, I tried creating a custom LinkMovementMethod class and implementing onTouchEvent...

public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
String url = text.toString();
// this doesn't work because the text is not necessarily a URL, or even a single link...
// eg, I don't know how to extract the clicked link from the greater paragraph of text
return false;


Example solution

I came up with a solution which parses the links out of a HTML string and makes them clickable, and then lets you respond to the URL.


Based upon another answer, here's a function setTextViewHTML() which parses the links out of a HTML string and makes them clickable, and then lets you respond to the URL.

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            // Do something with span.getURL() to handle the link click...
    strBuilder.setSpan(clickable, start, end, flags);

protected void setTextViewHTML(TextView text, String html)
    CharSequence sequence = Html.fromHtml(html);
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);   
    for(URLSpan span : urls) {
        makeLinkClickable(strBuilder, span);