利用SpannableStringBuilder设置TextView中部分文字的颜色

在日常开发中,又是需要对一串字符串中的某些子字符串显示其他颜色,这是就可以利用SpannableStringBuilder类来实现这种效果.

1、SpannableString、SpannableStringBuilder与String的关系

首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。
注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如前一章讲到的Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。

2、SpannableString与SpannableStringBuilder区别

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

3、setSpan()函数介绍

函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。(这个后面会具体举例说明)
参数说明
object what :对应的各种Span,后面会提到;
int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。从下面的例子也可以看出来。
int flags:取值有如下四个
1)、Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
2)、Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
3)、Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
4)、Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
举个例子来说明这个前后包括的问题:如给定一串字符串为123456789,现在设置显示效果为将123456789中的34设置成红色字体,如果flags设置的是Spannable.SPAN_INCLUSIVE_INCLUSIVE这种前后都包括的话,那么你在字符串中123456789中34子字符串中前后添加字符的话都会直接设置成红色字体。
好,介绍完成后,那么看下具体如何使用这写方法,下面为代码块。

4、代码块

private void showReplyNews(ViewHolder viewHolder,int position) {
        // TODO Auto-generated method stub
        TextView text = (TextView)findViewById(R.id.text);
        SpannableStringBuilder builder;
        String StrText = "欢迎来到jsjqcs的csdn博客主页"
        builder = new SpannableStringBuilder(StrText);
        builder.setSpan(new ForegroundColorSpan(Color.parseColor("#6CA6CD")), 
                    4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        builder.setSpan(new ForegroundColorSpan(Color.parseColor("#6CA6CD")), 
                    11,15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        text.setText(builder);  //
    }
}

这段代码主要功能利用SpannableStringBuilder来设置字符串颜色。是将“欢迎来到jsjqcs的csdn博客主页”字符串中的英文变成蓝色。如果要改变字符串中多处字体颜色,setSpan方法中第一个参数必须要每次new一个对象出来才能显示效果,像如下这种不会显示你想要的结果,下面程序得到的结果就是后面的颜色改变,前面的不会改变,原因就是你后面的对象将前面的对象值给覆盖了,这一点要注意。

ForegroundColorSpan span = new ForegroundColorSpan(Color.parseColor("#6CA6CD"));
builder.setSpan(span, 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(span, 11,15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setText(builder);  //
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值