×

Android 动态处理文本的两种方式

96
龙衣袭
2017.10.29 10:00* 字数 678
image.png

实现的效果就像这样,不知道是不是叫做动态处理文本。效果就是这么个效果,实现就是这么去实现,看下文分析。

使用场景

需要高亮文本中的某些内容,以突出重要的数据或者诱导用户去点击该内容。实现方式可以通过Html.fromHtml()方式和SpannableStringBuilder
( 或者SpannableString )去实现。

Tip: SpannableStringBuilder和SpannableString 的区别是 SpannableString 无法更改 String 的内容,也无法拼接多个SpannableString;

SpannableStringBuilder则可以通过其append()方法来拼接多个String,这里只介绍了SpannableStringBuilder的实现方式。

Html.fromHtml( ) 方式

Android目前不支持全部的HTML的标签,目前只支持与文本显示
和段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别;

实现效果
image.png
使用方式

首先需要拿到你要高亮的字符串,通过html标签去设置,下面的代码用到了font标签和strong标签。然后通过Html.from(string) 方法去解析该字符串即可实现效果。

String str2 = "我要<font color='#FF4081'>打赏</font>这个内容,<strong><font color='#FF4081'>作者太TM帅</font></strong>了balabala,谁也不许拦我,除非她给我发红包,或者点个Star"; 
mTvTestHtmlText.setText(Html.fromHtml(str2));

SpannableStringBuilder 方式

主要能实现的效果如下:
修改字体颜色
设置字体背景颜色
设置字体大小
设置粗体斜体
设置删除线
设置下划线
设置图片----将位置为多少多少的地方设置为图片
设置点击事件

使用方式

主要是通过 setSpan()方法去实现,由于该方法能够同时使用多个,因此同一个字符串的长度内的内容可以有多种显示效果,例如:效果图中的打赏二字,添加了下划线的同时字体的颜色页变成偏蓝色,而且还添加了点击效果哦

image.png

组合使用实现的效果:代码中有注释,挺好理解的
需要注意的是setSpan方法的最后一个参数,这个参数的含义是:控制第二和第三个参数的生效范围。它有四个可选值,分别是:

(前指的是第二个参数,后指的是第三个参数)

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)
Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)
Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)
Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)

String str2 = "我要<font color='#FF4081'>打赏</font>这个内容,<strong><font color='#FF4081'>作者太TM帅</font></strong>了balabala,谁也不许拦我,除非她给我发红包,或者点个Star";
SpannableStringBuilder builder = new SpannableStringBuilder(str1);    
// "我要"字体颜色变为粉色,Spanned.SPAN_EXCLUSIVE_INCLUSIVE 表示起始和终止的模式为:包左不包右       
builder.setSpan(new ForegroundColorSpan(Color.parseColor("#FF4081")), 0, 2, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置背景色       
builder.setSpan(new BackgroundColorSpan(Color.parseColor("#009ad6")), 4, 6, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置字体大小(绝对值,单位:像素)        
builder.setSpan(new AbsoluteSizeSpan(80), 12, 14, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置粗体和斜体       
builder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 15, 23, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置删除线       
builder.setSpan(new StrikethroughSpan(), 23, 29, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置下划线       
builder.setSpan(new UnderlineSpan(), 29, 35, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置图片       
builder.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), 35, 38, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);       
// 设置点击       
builder.setSpan(new ClickableSpan() {
           @Override
           public void onClick(View widget) {
               Toast.makeText(MainActivity.this, "点击了打赏", Toast.LENGTH_SHORT).show();
           }
       }, 2, 4, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);​ 
      mTvTestSpannerText.setText(builder);
       // 设置点击
   mTvTestSpannerText.setMovementMethod(LinkMovementMethod.getInstance());

项目地址

这是一个我平时遇到的不能一下子实现的功能而做的 Demo 仓库,里面实现的内容很杂,想到什么就去实现什么,所以见谅吧。

地址是: AndroidLeaningDemo 在166~197行左右

开发
Web note ad 1