Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I link some text of a TextView to an Activity?

Tags:

android

I would like to link some text on a TextView to an Activity. This is the TextView that I have:

<TextView
     android:id="@+id/termsLink"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/terms"
     android:layout_weight="4"/>

where @string/terms is:

<string name="terms">Accept <a href="#">terms & conditions.</a>.</string>

If I had a link to a webpage I would do it like this:

TextView link = (TextView) findViewById(R.id.termsLink);
link.setMovementMethod(LinkMovementMethod.getInstance());

but I do not know how to start an Activity when I press the link as when it is a real link (that it links a webpage).

EDIT: Please note that I do not have to handle the onClick event in the full text because the link is only on the part "terms & conditions".

EDIT 2: I have tried using two TextView as suggested on the comments and one of the answers below to make the same effect. But sometimes (depending on the screen) the "terms & conditions" part occupy two lines because it does not fill properly on the available space so the second line it is shown on the second TextView and not on the begining of the second line.

The effect is similar to this:

Accept terms & 
       conditions.

and I would like that it would be like this:

Accept terms &
conditions.

Thanks in advance!

like image 757
Francisco Romero Avatar asked Feb 01 '26 06:02

Francisco Romero


1 Answers

Create a helper class with inner onClick listener

public class ClickSpan extends ClickableSpan {

    private String url;
    private OnClickListener listener;

    public ClickSpan(String url, OnClickListener listener) {
        this.url = url;
        this.listener = listener;
    }

    @Override
    public void onClick(View widget) {
        if (listener != null) listener.onClick(url);
    }

    public interface OnClickListener {
        void onClick(String url);
    }
}

Then convert existing span into clickable one

public static Spannable createClickableSpans(Spanned original,     ClickSpan.OnClickListener listener) {
    SpannableString result = new SpannableString(original);
    URLSpan[] spans = result.getSpans(0, result.length(), URLSpan.class);

    for (URLSpan span : spans) {
        int start = result.getSpanStart(span);
        int end = result.getSpanEnd(span);
        int flags = result.getSpanFlags(span);

        result.removeSpan(span);
        result.setSpan(new ClickSpan(span.getURL(), listener), start, end, flags);
    }

    return result;
}

So, final usage would be like

TextView link = (TextView) findViewById(R.id.termsLink);
link.setMovementMethod(LinkMovementMethod.getInstance());
link.setText(createClickableSpans((Spanned)link.getText(), new ClickSpan.OnClickListener(){
    @Override
    public void onClick(String url){
        //Handle URL on text view click
    }
}));
like image 197
jpact Avatar answered Feb 02 '26 21:02

jpact