Android中强大的SpannableStringBuilder

之前用过SpannableStringBuilder,今天有些时间,于是将这一块总结一下。

前言:
SpannableStringBuilder:
This is the class for text whose content and markup can both be changed.
(这是一个内容和标记都可以更改的文本类)
在这里插入图片描述
SpannableStringBuilder有个亲兄弟SpannableString
在这里插入图片描述
SpannableStringBuilder和SpannableString之间的关系类似于StringBuilder和String的关系,SpannableStringBuilder可以拼接,而SpannableString不可以。
SpannableStringBuilder和SpannableString都可以设置文本样式,并且SpannableStringBuilder和SpannableString都实现了CharSequence,因此可以直接传入textView的setText中。

主要的方法
setSpan(Object what, int start, int end, int flags)
SpannableStringBuilder和SpannableString都是通过上述方法来改变文本的样式的。

对应的参数:
start: 指定Span的开始位置
end: 指定Span的结束位置,并不包括这个位置。
flags:取值有如下四个
Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式
Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式
Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括
Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括
what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有:
BackgroundColorSpan : 文本背景色
ForegroundColorSpan : 文本颜色
MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕
RasterizerSpan : 光栅效果
StrikethroughSpan : 删除线
SuggestionSpan : 相当于占位符
UnderlineSpan : 下划线
AbsoluteSizeSpan : 文本字体(绝对大小)
DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。
ImageSpan : 图片
RelativeSizeSpan : 相对大小(文本字体)
ScaleXSpan : 基于x轴缩放
StyleSpan : 字体样式:粗体、斜体等
SubscriptSpan : 下标(数学公式会用到)
SuperscriptSpan : 上标(数学公式会用到)
TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan : 文本字体
URLSpan : 文本超链接
ClickableSpan : 点击事件

实例
实例一

                    SpannableStringBuilder style = new SpannableStringBuilder();
                    content = "<h3><font color='#FB7272'>打败了全国80%的同行,太棒了!</font></h3>\n" +
                            "你管理的门店3月25日的违规项达到<font color='#FB7272'>358</font>起,其中高风险问题累计<font color='#FB7272'>48</font>起。";
                    Spanned spanned = Html.fromHtml(content);
                    String clickString = "查看更多详情>>";
                    //设置文字
                    style.append(spanned);
                    style.append(clickString);
                    //设置部分文字点击事件
                    ClickableSpan clickableSpan = new ClickableSpan() {
                        @Override
                        public void onClick(View widget) {
                            Intent intent = new Intent(getActivity(), MoreDetailsAboutTodayAnnouncementActivity.class);
                            intent.putExtra("date", todayAnnouncementDate);
                            intent.putExtra("brandId", brandId);
                            startActivity(intent);
                        }

                        @Override
                        public void updateDrawState(TextPaint ds) {
                            ds.setUnderlineText(false);
                        }
                    };
                    style.setSpan(clickableSpan, spanned.length(), spanned.length() + clickString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    //设置部分文字颜色
                    ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.selectedColor));
                    style.setSpan(foregroundColorSpan, spanned.length(), spanned.length() + clickString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    //配置给TextView
                    tv_today_announcement_content.setMovementMethod(LinkMovementMethod.getInstance());
                    tv_today_announcement_content.setText(style);

注:setMovementMethod(LinkMovementMethod.getInstance()),如果设置了点击事件,这一行代码是必须的。
另外,去掉具有点击功能文字下方的下划线,除了使用上述的方法

                        @Override
                        public void updateDrawState(TextPaint ds) {
                            ds.setUnderlineText(false);
                        }

以外,我们还可以通过这样子:

            @Override
            public void updateDrawState(TextPaint ds) {
//                super.updateDrawState(ds);
            }

即,将父类的updateDrawState的方法实现给注释掉。

实例二

        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
        String string = "提示:“ ”标识,代表高风险问题。";
        spannableStringBuilder.append(string);
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.baseColor4));
        spannableStringBuilder.setSpan(foregroundColorSpan, 0, string.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ImageSpan imageSpan = new ImageSpan(this, R.mipmap.warning);
        spannableStringBuilder.setSpan(imageSpan, 4, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv_hint.setText(spannableStringBuilder);

实现在"提示:“ ”标识,代表高风险问题。"文本中插入一张图片。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值