富文本SpannableString

QuibblerQuibbler 2020-02-06 约 12 分钟 2090 次阅读

SpannableString

1、SpannableString简介

和String类似,不过SpannableString的功能更加丰富强大。给原本枯燥的文本添加各种功能和色彩。比如颜色、字体、超链接、表情、点击响应等功能。源码中关于SpannableString的解释如下:

/ **
      *这是用于文本的类,其内容是不可变的,但可以将标记对象附加和分离到该文本。
      *有关可变文本,请参见SpannableStringBuilder。
      * /

2、设置风格:SetSpan()

关于SpannableString源码就70余行,除了几个构造函数,还有一个重要的方法setSpan(Object what, int start, int end, int flags),专门用来给SpannableString设置风格。其中4个参数含义如下:

what :是一个Object对象,用来指定字符串的显示风格(Android已经预定义了大量丰富的Span类,还可以继承已有的进行自定义)

sart   :应用此Span的字符串的起始位置

end   :应用此Span的字符串的结束位置

flags :有四种形式,就是确定作用空间是否包括收尾。四种值及其含义如下:

//从起始下标到终了下标,包括起始下标
    Spanned.SPAN_INCLUSIVE_EXCLUSIVE 
    
    //从起始下标到终了下标,同时包括起始下标和终了下标
    Spanned.SPAN_INCLUSIVE_INCLUSIVE
    
    //从起始下标到终了下标,但都不包括起始下标和终了下标
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    
    //从起始下标到终了下标,包括终了下标
    Spanned.SPAN_EXCLUSIVE_INCLUSIVE

3、常用Span类介绍

Android已经在package android.text.style包中预定义了37个富文本Span类

BackgroundColorSpan            背景色

ClickableSpan                          文本可点击,有点击事件

ForegroundColorSpan            文本颜色(前景色)

MaskFilterSpan                       修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)

MetricAffectingSpan              父类,一般不用

RasterizerSpan                        光栅效果

StrikethroughSpan                 删除线(中划线)

SuggestionSpan                     相当于占位符

UnderlineSpan                        下划线

AbsoluteSizeSpan                   绝对大小(文本字体)

DynamicDrawableSpan          设置图片,基于文本基线或底部对齐。

ImageSpan                             图片

RelativeSizeSpan                    相对大小(文本字体)

ReplacementSpan                  父类,一般不用

ScaleXSpan                            基于x轴缩放

StyleSpan                               字体样式:粗体、斜体等

SubscriptSpan                        下标(数学公式会用到)

SuperscriptSpan                    上标(数学公式会用到)

TextAppearanceSpan            文本外貌(包括字体、大小、样式和颜色)

TypefaceSpan                        文本字体

URLSpan                                文本超链接

4、用法示例

先声明一个SpannableString对象,传入String字符串

SpannableString spannableString = new SpannableString(string);

在创建一个特定的Span对象,比如这里创建一个URLSpan

URLSpan urlSpan = new URLSpan("https://www.baidu.com");

将Span对象setSpan设置给SpannableString对象,开始和起始位置,及flag。

spannableString.setSpan(urlSpan, 10, 20, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);

最后将构造好的SpannableString对象,可以直接setText()给TextView等控件。因为SpannableString类也是实现了CharSequence接口

mTextView.setText(spannableString);

等等,为什么点击没有反应呢?!这里还有重要的一步给TextView设置setMovementMethod(MovementMethod movement)

mTextView.setMovementMethod(LinkMovementMethod.getInstance());

5、SpannableBuilder

SpannableStringBuilder 和 SpannableString 的关系就和String 和 StringBuilder 的关系是一样的,使用SpannableStringBuilder的append(...)来拼接SpannableString效率会更高。

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();

进行字符串的拼接

spannableStringBuilder.append(string);

设置Span样式,

spannableStringBuilder.setSpan(urlSpan, 10, 20, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);

SpannableBuilder也可以直接设置给TextView,同样实现了CharSequence接口

mTextView.setText(spannableStringBuilder);

6、自定义Span

已有的Span样式已经很丰富,但是有时候仍不能满足开发中遇到的需求。自定义样式,只需要继承已有的Span样式,重写其中需要的方法即可。

比如自定义一个URLSpan,重写其中的onClick()方法,响应超链接的点击事件。

class MyUrlSpan extends URLSpan {
    
        public MyUrlSpan(String url) {
            super(url);
        }
        
        public MyUrlSpan(@NonNull Parcel src) {
            super(src);
        }
        
        @Override
        public void onClick(View widget) {
            mWebView.loadUrl(getURL());
            mWebView.setWebViewClient(new WebViewClient());
        }
    }

相关参考:

        TextView.SetLinkMovementMethod后拦截所有点击事件的原因以及解决方法

        Android中TextView富文本适配问题

        安卓开发中SpannableString之富文本显示效果

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w

评论 (1)

评论功能已关闭,仅展示历史评论
Quibbler
Quibbler

ClickableSpan 去除下划线

        点击ClickableSpan默认是有一个下划线的,显得不美观,可以重写其中的updateDrawState(TextPaint ds)方法,去除下划线:

    ClickableSpan clickableSpan = new ClickableSpan() {
    
        @Override
        public void onClick(View textView) {
            
        }
        
        //去除连接下划线
        @Override
        public void updateDrawState(TextPaint ds) {
            /**set textColor**/
            ds.setColor(ds.linkColor);
            /**Remove the underline**/
            ds.setUnderlineText(false);
        }
        
    };