如何摆脱带有Clickable对象的Spannable字符串中的下划线?


69

我有Spannable Object一个Clickable Object集来。在Spannable String中显示时,TextView它具有蓝色文本和蓝色下划线(向用户指示此文本是可单击的)。我的问题是如何防止出现蓝色下划线TextView

Answers:


130

使用以下代码并尝试

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

7
ds.setColor(Color.rgb(0, 0 , 255));在可扩展字符串上保持蓝色(或将其更改为所需的任何颜色)。
雨果·阿莱克西斯·卡多纳'18

我们可以在updateDrawState(TextPain ds){}方法中设置其他属性
Parth Patel,

奇怪的是没有更好的解决方案(至少在这里发布)。updateDrawState被调用了很多次,这不是配置绘画的正确位置。
Ixx

52

这对我有用。无需创建自定义ClickableSpan类。只需覆盖即可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);

6

Raghunandan的回答对我来说非常有效。这是它的简化版本:

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

5

覆盖ClickableSpan类的updateDrawState方法

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
}

用于更改跨度字符串的颜色

  SpannableString    ss = new SpannableString("android Stack Overflow");

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

3

最简单的方法是

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

1
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
                    }
                }

1

spannableStringObject.toString();

编辑

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

将从Spannable中删除所有UnderlineSpans。


刚刚尝试了上述答案,它确实可以工作,但是我的Clickable Object现在不起作用了吗?
2013年

@Ash我不知道这是什么意思。.为什么不在您的问题中提供更多的背景信息。
dcow

由于SpannableString实现了CharacterSequence,因此toString返回由SpannableString表示的字符。我上面显示的内容将从SpannableString中删除所有格式。
dcow

只是为我的问题添加了更多背景知识。
2013年

toString()从字面上摆脱了我需要的Clickable对象。
2013年

1

ANURAG RASTOGI的回答为我节省了一天!我已经有一种格式SpannableString可以应用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);

updateDrawState覆盖updateDrawStateClickableSpanAndroid中类,并没有要求super.updateDrawState它不会得到执行。

已经存在的所有文本格式spannableString将被保留。


0

如果您不希望任何预先应用的属性,请不要调用super.updateDrawState()。在覆盖updateDrawState(对象:Textpaint)与帮助对象可以申请或拨打出现在文本画图不同的功能。


0

基于@ Sai Gopi Me的答案

在科特林:

val clickableSpan: ClickableSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // some action here
    }
                
    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)
        ds.isUnderlineText = false
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.