SpannableStringBuilder和SpannableString的区别类似与StringBuilder、String,就是SpannableStringBuilder可以拼接,而SpannableString不可拼接。

主要的方法

SpannableStringBuilder和SpannableString主要通过使用setSpan(Object what, int start, int end, int flags)改变文本样式。
对应的参数:

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 : 点击事件
用法

先在xml中创建一个TextView:

<TextView    android:id="@+id/mode1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textSize="18dp" />

SpannableStringBuilder和SpannableString的用法差不多,这边先举一个SpannableString的例子

SpannableString
修改字体颜色

 /**     * 使用SpannableString设置样式——字体颜色     */    private void mode1() {        SpannableString spannableString = new SpannableString("暗影IV已经开始暴走了");        ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));        spannableString.setSpan(colorSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode1)).setText(spannableString);    }
创建SpannableString的时候,传入需要显示的字符串。使用ForegroundColorSpan为文字设置颜色。效果:字体颜色

后面都以SpannableStringBuilder为例子

SpannableStringBuilder

修改字体颜色
    /**     * 使用SpannableStringBuilder设置样式——字体颜色     */    private void mode2() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV");        spannableString.append("已经开始暴走了");        ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));        spannableString.setSpan(colorSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode2)).setText(spannableString);    }
这里就可以看出SpannableStringBuilder的可拼接性,这里同样采用了ForegroundColorSpan为文本设置颜色。
 /**     * 使用SpannableStringBuilder设置样式——背景颜色     */    private void mode3() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        BackgroundColorSpan bgColorSpan = new BackgroundColorSpan(Color.parseColor("#009ad6"));        spannableString.setSpan(bgColorSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode3)).setText(spannableString);    }
使用BackgroundColorSpan设置背景颜色。
 /**     * 使用SpannableStringBuilder设置样式——字体大小     */    private void mode4() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(20);        spannableString.setSpan(absoluteSizeSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode4)).setText(spannableString);    }
使用AbsoluteSizeSpan设置字体大小。
  /**     * 使用SpannableStringBuilder设置样式——粗体\斜体     */    private void mode5() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        //setSpan可多次使用        StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);//粗体        spannableString.setSpan(styleSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        StyleSpan styleSpan2 = new StyleSpan(Typeface.ITALIC);//斜体        spannableString.setSpan(styleSpan2, 3, 6, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        StyleSpan styleSpan3 = new StyleSpan(Typeface.BOLD_ITALIC);//粗斜体        spannableString.setSpan(styleSpan3, 6, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode5)).setText(spannableString);    }
粗体\斜体删除线
 /**     * 使用SpannableStringBuilder设置样式——删除线     */    private void mode6() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        StrikethroughSpan strikethroughSpan = new StrikethroughSpan();        spannableString.setSpan(strikethroughSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode6)).setText(spannableString);    }
StrikethroughSpa使用StrikethroughSpan设置删除线。删除线下划线
  /**     * 使用SpannableStringBuilder设置样式——下划线     */    private void mode7() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        UnderlineSpan underlineSpan = new UnderlineSpan();        spannableString.setSpan(underlineSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode7)).setText(spannableString);    }
使用UnderlineSpan设置下划线。下划线不仅支持文字样式,还可以插入图片。厉害了我的SpannableStringBuilder~~
 /**     * 使用SpannableStringBuilder设置样式——图片     */    private void mode8() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);        //也可以这样        //Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);        //drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());        //ImageSpan imageSpan1 = new ImageSpan(drawable);        //将index为6、7的字符用图片替代        spannableString.setSpan(imageSpan, 6, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        ((TextView)findViewById(R.id.mode8)).setText(spannableString);    }
使用ImageSpan设置图片,将index为6、7的字符替换成了图片,也就是说,该图片占有index6和7的位置。点击事件插入图片就已经很变态了,居然还支持点击事件。
    /**     * 使用SpannableStringBuilder设置点击事件     */    private void mode9() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        ClickableSpan clickableSpan = new ClickableSpan() {            @Override            public void onClick(View view) {                Toast.makeText(MainActivity.this, "请不要点我", Toast.LENGTH_SHORT).show();            }        };        spannableString.setSpan(clickableSpan, 5, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        TextView textView = (TextView)findViewById(R.id.mode9);        textView.setText(spannableString);        textView.setMovementMethod(LinkMovementMethod.getInstance());    }
使用ClickableSpan设置点击事件,最后还需要加上textView.setMovementMethod(LinkMovementMethod.getInstance());。代码中指定index为5、6、7的字符都成了可点击的文本,其他区域还是不可点击的。

点击事件

有同学反映设置部分点击事件后,还需要给真整个TextView单独设置点击事件时会出问题。想知道什么问题?自己去试试看,哈哈哈~~
这边有一个我在CSDN上看到的解决方法,可以从另一个角度来解决这个问题。——解决方案

组合使用
 /**     * 使用SpannableStringBuilder事件组合使用     */    private void mode10() {        SpannableStringBuilder spannableString = new SpannableStringBuilder();        spannableString.append("暗影IV已经开始暴走了");        //图片        ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);        spannableString.setSpan(imageSpan, 2, 4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        //点击事件        ClickableSpan clickableSpan = new ClickableSpan() {            @Override            public void onClick(View view) {                Toast.makeText(MainActivity.this, "请不要点我", Toast.LENGTH_SHORT).show();            }        };        spannableString.setSpan(clickableSpan, 2, 4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        //文字颜色        ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#FFFFFF"));        spannableString.setSpan(colorSpan,5, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        //文字背景颜色        BackgroundColorSpan bgColorSpan = new BackgroundColorSpan(Color.parseColor("#009ad6"));        spannableString.setSpan(bgColorSpan, 5, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        TextView textView = (TextView)findViewById(R.id.mode10);        textView.setText(spannableString);        textView.setMovementMethod(LinkMovementMethod.getInstance());    }
例子中将ImageSpan、 ClickableSpan、 ForegroundColorSpan、BackgroundColorSpan 进行了组合使用,大家可以根据自己的需求,来随意搭配。

更多相关文章

  1. 定时任务方案
  2. php、java、android、ios通用的3des方法(推荐)
  3. android点击文本框之外的地方隐藏键盘
  4. Android中对同一个TextView设置不同字体样式
  5. Android(安卓)新建文件夹、生成文件并向文件写入文本内容
  6. Android使用selector改变和文本框文字的颜色
  7. Android(安卓)定制RadioButton样式
  8. Android消息提示框和对话框
  9. android之自定义带图片的title

随机推荐

  1. 关于Android中的位置服务解读
  2. 谈谈WM和Android比较
  3. TextView 相关属性
  4. Android(安卓)技术专题系列之十一 -- DRM
  5. 在 Android 开发中使用协程 | 背景介绍
  6. [置顶] 强烈推荐转载-Android 性能测试
  7. android动态获取TextView的属性(width、he
  8. Android:style和theme
  9. Plan B:Android 的 find my phone,可事后安
  10. android 6.0 关于定位的那些坑