How to get rid of the underline in a Spannable String with a Clickable Object?

AndroidTextviewSpannable

Android Problem Overview


I have a Spannable Object with a Clickable Object set to it. When the Spannable String is displayed in the TextView it has blue text and a blue underline (indicating to the user that this Text is Clickable). My problem is how can I prevent appearing the blue underline in TextView?

Android Solutions


Solution 1 - Android

Use the below code and try

String mystring =" Hello";
SpannableString ss= new SpannableString(mystring);
ss.setSpan(new MyClickableSpan(mystring), 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

class MyClickableSpan extends ClickableSpan{// extend ClickableSpan 	

    String clicked;
    public MyClickableSpan(String string) {
        super();
        clicked = string;
    }
    @Override
    public void onClick(View tv) {
       Toast.makeText(MainActivity.this,clicked , Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void updateDrawState(TextPaint ds) {// override updateDrawState
        ds.setUnderlineText(false); // set to false to remove underline
    }
}

Solution 2 - Android

This works for me. No need to create custom ClickableSpan class. Just override updateDrawState(TextPaint ds).

SpannableString span = new SpannableString("Some text");
ClickableSpan clickSpan = new ClickableSpan() {
    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(ds.linkColor);    // you can use custom color
        ds.setUnderlineText(false);    // this remove the underline
    }

    @Override
    public void onClick(View textView) {
        // handle click event
    }
};

span.setSpan(clickSpan, 5, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
yourTextView.setText(span);

Solution 3 - Android

Raghunandan's answer works perfectly for me. Here is a pared-down version of it:

public abstract class NoUnderlineClickableSpan extends ClickableSpan {    
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
    }
}

Solution 4 - Android

Override updateDrawState method of ClickableSpan class

String mystring =" Hello";
SpannableString ss= new SpannableString(mystring);
ss.setSpan(new MyClickableSpan(mystring), 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

class MyClickableSpan extends ClickableSpan{// extend ClickableSpan     

String clicked;
public MyClickableSpan(String string) {
    // TODO Auto-generated constructor stub
super();
clicked =string;
}

public void onClick(View tv) {

   Toast.makeText(MainActivity.this,clicked ,
        Toast.LENGTH_SHORT).show();
}

public void updateDrawState(TextPaint ds) {// override updateDrawState
   ds.setUnderlineText(false); // set to false to remove underline
}

For changing color of spannable String

  SpannableString    ss = new SpannableString("android Stack Overflow");
    
  ForegroundColorSpan fcs=newForegroundColorSpan(Color.parseColor("#01579B"));
  ss.setSpan(fcs, 8,13, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

Solution 5 - Android

simplest way is

 string1 = new SpannableString("By Tapping Register You Agree To The \nTerms And Conditions");
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Toast.makeText(getApplicationContext(),"clicked",Toast.LENGTH_SHORT).show();
        }
        @Override
        public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);    // this line removes underline
        }

    };
    text_terms.setMovementMethod(LinkMovementMethod.getInstance());
    string1.setSpan(clickableSpan,37,string1.length(),0);
    text_terms.setText(string1);

Solution 6 - Android

> spannableStringObject.toString();

Edit

SpannableString ss = getYourSpannableString();
UnderlineSpan[] uspans = ss.getSpans(0, ss.length(), UnderlineSpan.class);
for (UnderlineSpan us : uspans) {
    ss.removeSpan(us);
}

Will remove all the UnderlineSpans from the Spannable.

Solution 7 - Android

Try the below code to remove underlined and clicked event on multiple words in textview :
 
   

            String str="Angelina Clapped For Lester Kang";
            Spannable span = Spannable.Factory.getInstance().newSpannable(str);
            
            // 0 to 8 start and  index of Angelina
            span.setSpan(new ClickableSpan(str), 0, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

             //  21 to 32  start and  index of Lester  Kang
            span.setSpan(new ClickableSpan(str), 21, 32, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

            textview.setText(span);
              
             class ClickableSpan extends ClickableSpan{
            
                    String clicked;
                    public ClickableSpan (String string) {
                        super();
                       
                    }
            
                    public void onClick(View v) {
                        Toast.makeText(MyActivity.this,""+((TextView)v).getText().toString(),Toast.LENGTH_SHORT).show();
                    }
            
                    public void updateDrawState(TextPaint ds) {
                       // override updateDrawState
                        ds.setUnderlineText(false); // set to false to remove underline
                    }
                }

Solution 8 - Android

ANURAG RASTOGI's answer saved the day for me! I already have a formatted SpannableString on which I wanted to apply a ClickableSpan:

spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        // Do something...
    }
    // Prevent
    // ds.setColor(ds.linkColor);
    // ds.setUnderlineText(true);
    // in: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/ClickableSpan.java
    // from executing.
    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        // super.updateDrawState(ds);
    }
},0, spannableString.length(), SPAN_EXCLUSIVE_EXCLUSIVE);

The updateDrawState overrides the updateDrawState in the ClickableSpan class in Android, and by not calling super.updateDrawState it will not get executed.

All text formatting already present in spannableString will be preserved.

Solution 9 - Android

Based on the answer of @Sai Gopi Me

in Kotlin:

val clickableSpan: ClickableSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // some action here
	}
				
    override fun updateDrawState(ds: TextPaint) {
	    super.updateDrawState(ds)
		ds.isUnderlineText = false
		}
	}
}

Solution 10 - Android

If you do not want any pre-applied attributes do not call super.updateDrawState(). On overriding updateDrawState(object:Textpaint) with help of object you can apply or call different functions present in Text Paint.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAshView Question on Stackoverflow
Solution 1 - AndroidRaghunandanView Answer on Stackoverflow
Solution 2 - AndroidARiFView Answer on Stackoverflow
Solution 3 - AndroidJo JoView Answer on Stackoverflow
Solution 4 - AndroidSanjay JainView Answer on Stackoverflow
Solution 5 - Androidsaigopi.meView Answer on Stackoverflow
Solution 6 - AndroiddcowView Answer on Stackoverflow
Solution 7 - AndroidPradeep GuptaView Answer on Stackoverflow
Solution 8 - AndroidErik TerwanView Answer on Stackoverflow
Solution 9 - AndroidAzhagthottView Answer on Stackoverflow
Solution 10 - AndroidANURAG RASTOGIView Answer on Stackoverflow