Francisco Romero
Francisco Romero

Reputation: 13199

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

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!

Upvotes: 3

Views: 2811

Answers (3)

jpact
jpact

Reputation: 1072

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

Upvotes: 1

KeaneDaSilva
KeaneDaSilva

Reputation: 1

You should probably separate the text into 2 text views one with the terms and condition and one with just the accept.It would make things cleaner and easier. The following TextView is assuming its just for accept.

In the layouts corresponding java class(example: activity_main -> MainActivity):

public void start_activity(View view){
   Intent newActivityIntent = new Intent(this,NewActivity.class);
   startActivity(newActivityIntent);
}

NewActivity.class is just the name of the activity you want to start.

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
         ....
    }

    public void start_activity(View view){
         .....
    } 
}

Upvotes: 0

fersarr
fersarr

Reputation: 3531

To make only part of a TextView clickable, you can use a spannable inside the TextView and set an onClick event listener. From here, you launch the activity with an intent as usual. You can limit the clickable section of the text by specifying the character positions (start to end)

Checkout this answer by @becomputer06

How to set the part of the text view is clickable

Upvotes: 0

Related Questions