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