Textview的样式改变——SpannableString

本文介绍了如何使用SpannableString和SpannableStringBuilder为Android中的文本添加样式,如字体颜色、背景颜色、大小、粗体、删除线等,并展示了如何实现文本点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpannableString、SpannableStringBuilder与String的关系

SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。

SpannableString与SpannableStringBuilder区别

它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String:

SetSpan()
void setSpan (Object what, int start, int end, int flags)

参数说明:

object what :对应的各种Span,后面会提到;
int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。从下面的例子也可以看出来。
int flags:取值有如下四个
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。

flags插入新的字符,比如在EditTextView中输入字符的时候

各种Span设置

1 设置字体颜色

String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new ForegroundColorSpan(Color.RED),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssBuilder);

2 设置字体背景颜色

String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new BackgroundColorSpan(Color.RED),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssBuilder);

3 设置字体大小

String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new AbsoluteSizeSpan(35),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssBuilder);

4 粗体

String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssBuilder);

5 删除线

String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new StrikethroughSpan(),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssBuilder);

6 下划线

String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new UnderlineSpan(),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssBuilder);

7 点击事件

//这个一定要设置
tv.setMovementMethod(LinkMovementMethod.getInstance());
String str = "一经注册,表示您同意我们的《用户协议》,点击查看!";
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(str);
ssBuilder.setSpan(new TextClick(),str.indexOf("《"),str.indexOf("》")+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(ssBuilder);
private class TextClick extends ClickableSpan{
        @Override
        public void onClick(View widget) {
            Log.i(TAG, "onClick: text");
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值