最近开发类似微信朋友圈的点赞列表,每一个用户名称一个类似超级链接的形式,中间用逗号分割,而且用户名还需要点击事件。第一时间想到的当然是使用Textview,如果用多个Textview排列起来,做起来会很臃肿。那么如何实现呢?
使用SpannableString和SpannableStringBuilder
其实使用SpannableString和SpannableStringBuilder一个Textview就可以实现这样的需求。
我们知道使用textview.setText("12345678字符串")可以设置文本,但这个方法的参数类型不是String,而是一个接口CharSequence,当然String是实现了这个接口的,所以可以传入。
同样SpannableString和SpannableStringBuilder也是实现了CharSequence接口,所以我们可以使用这两个对象代替String。
构建SpannableString
SpannableString spannableString = new SpannableString("12345678字符串");//new
textview.setText(spannableString);//使用
上面代码和textview.setText("12345678字符串")效果是一样的。
SpannableString的强大之处在于可以设置span,span意思就是在字符串的一定区域显示不同的效果,如字体颜色、背景颜色、点击时间、下划线、字体大小等等等等。。。,以下代码设置字符串‘12345’的背景颜色为#cccccc,而且具有点击事件
//点击效果
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
//这里处理点击事件
}
};
//背景颜色
BackgroundColorSpan bs =new BackgroundColorSpan(Color.parseColor("#CCCCCC");
//下面两个效果的叠加的,不回覆盖
spannableString.setSpan(clickableSpan,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(bs,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannableString);
//加上这句才会有点击响应。。
textview.setMovementMethod(LinkMovementMethod.getInstance());
setSpan的参数:setSpan(Object what, int start, int end, int flags),其中flags可以是以下的值:
-
Spanned.SPAN_EXCLUSIVE_INCLUSIVE:在 Span前面输入的字符不应用 Span的效果,在后面输入的字符应用Span效果。 -
Spanned.SPAN_INCLUSIVE_EXCLUSIVE:在 Span前面输入的字符应用 Span 的效果,在后面输入的字符不应用Span效果。 -
Spanned.SPAN_INCUJSIVE_INCLUSIVE:在 Span前后输入的字符都应用 Span 的效果。
setSpan方法设置一个span对象,它的参数类型是Object,已知可用的类有:
| 类/接口名 | 说明 |
|---|---|
| BackgroundColorSpan | 背景色 |
| ClickableSpan | 文本可点击,有点击事件 |
| ForegroundColorSpan | 文本颜色(前景色) |
| MaskFilterSpan | 修饰效果,如模糊(BlurMaskFilter)浮雕 |
| (EmbossMaskFilter)MetricAffectingSpan | 父类,一般不用 |
| RasterizerSpan | 光栅效果 |
| StrikethroughSpan | 删除线(中划线) |
| SuggestionSpan | 相当于占位符 |
| UnderlineSpan | 下划线 |
| AbsoluteSizeSpan | 绝对大小(文本字体) |
| DynamicDrawableSpan | 设置图片,基于文本基线或底部对齐。 |
| ImageSpan | 图片 |
| RelativeSizeSpan | 相对大小(文本字体) |
| ReplacementSpan | 父类,一般不用 |
| ScaleXSpan | 基于x轴缩放 |
| StyleSpan | 字体样式:粗体、斜体等 |
| SubscriptSpan | 下标(数学公式会用到) |
| SuperscriptSpan | 上标(数学公式会用到) |
| TextAppearanceSpan | 文本外貌(包括字体、大小、样式和颜色) |
| TypefaceSpan | 文本字体 |
| URLSpan | 文本超链接 |
怎么使用可以一个个试过去
SpannableString和SpannableStringBuilder的关系
有点类似与String和StringBuilder
SpannableString是不可变长度的
SpannableStringBuilder是可变长度的
用法上都差不多,复杂效果组合使用更加方便快捷,它们可以这样组合:
SpannableStringBuilder ssb = new SpannableStringBuilder("嘿嘿");
SpannableString ss1 = new SpannableString("①号");
SpannableString ss2 = new SpannableString("②号");
ssb.append(ss1);
ssb.append(ss2);
ssb.append("也可以是字符串");