How to set the part of the text view is clickable How to set the part of the text view is clickable android android

How to set the part of the text view is clickable


android.text.style.ClickableSpan can solve your problem.

SpannableString ss = new SpannableString("Android is a Software stack");ClickableSpan clickableSpan = new ClickableSpan() {    @Override    public void onClick(View textView) {        startActivity(new Intent(MyActivity.this, NextActivity.class));    }    @Override    public void updateDrawState(TextPaint ds) {        super.updateDrawState(ds);        ds.setUnderlineText(false);    }};ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);TextView textView = (TextView) findViewById(R.id.hello);textView.setText(ss);textView.setMovementMethod(LinkMovementMethod.getInstance());textView.setHighlightColor(Color.TRANSPARENT);

In XML:

<TextView   ...  android:textColorLink="@drawable/your_selector"/>


My function for make multiple links inside TextView
Update 2020: Now this function able to support multiple same texts link inside 1 TextView, but remember to put the link in the correct order

fun TextView.makeLinks(vararg links: Pair<String, View.OnClickListener>) {    val spannableString = SpannableString(this.text)    var startIndexOfLink = -1    for (link in links) {        val clickableSpan = object : ClickableSpan() {            override fun updateDrawState(textPaint: TextPaint) {                // use this to change the link color                textPaint.color = textPaint.linkColor                // toggle below value to enable/disable                // the underline shown below the clickable text                textPaint.isUnderlineText = true            }            override fun onClick(view: View) {                Selection.setSelection((view as TextView).text as Spannable, 0)                view.invalidate()                link.second.onClick(view)            }        }        startIndexOfLink = this.text.toString().indexOf(link.first, startIndexOfLink + 1)//      if(startIndexOfLink == -1) continue // todo if you want to verify your texts contains links text        spannableString.setSpan(            clickableSpan, startIndexOfLink, startIndexOfLink + link.first.length,            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE        )    }    this.movementMethod =        LinkMovementMethod.getInstance() // without LinkMovementMethod, link can not click    this.setText(spannableString, TextView.BufferType.SPANNABLE)}

USING

my_text_view.makeLinks(        Pair("Terms of Service", View.OnClickListener {            Toast.makeText(applicationContext, "Terms of Service Clicked", Toast.LENGTH_SHORT).show()        }),        Pair("Privacy Policy", View.OnClickListener {            Toast.makeText(applicationContext, "Privacy Policy Clicked", Toast.LENGTH_SHORT).show()        }))

XML

<TextView    android:id="@+id/my_text_view"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Please accept Terms of Service and Privacy Policy"    android:textColorHighlight="#f00" // background color when pressed    android:textColorLink="#0f0"    android:textSize="20sp" />

DEMO

Reference

Solution for clear the link highlight selection follow https://stackoverflow.com/a/19445108/5381331


You can use ClickableSpan as described in this post

Sample code:

TextView myTextView = new TextView(this);String myString = "Some text [clickable]";int i1 = myString.indexOf("[");int i2 = myString.indexOf("]");myTextView.setMovementMethod(LinkMovementMethod.getInstance());myTextView.setText(myString, BufferType.SPANNABLE);Spannable mySpannable = (Spannable)myTextView.getText();ClickableSpan myClickableSpan = new ClickableSpan() {   @Override   public void onClick(View widget) { /* do something */ }};mySpannable.setSpan(myClickableSpan, i1, i2 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Reference