前段时间做项目,遇到了要对一组文字添加图片和设置文字不同的效果!其中下图的12项是通过服务器获取的数据。想想怎么弄呢,这还得写两个textview,还要设置对齐等等,当时心里就一万个不乐意,琢磨能不能有什么简单的办法。。
以后遇到问题都写下来记录下来吧,也当做我学习的一个总结。
费了不少力气,原来google早就给我们写好了,只需要简单的调用就好!
就是SpannableStringBuilder,以前貌似没有听过。学习一下,果然很好用。
废话不多说,直接上代码。
SpannableStringBuilder stringBuilder = new SpannableStringBuilder("中国人民站起来了!!!");
stringBuilder.append("美国人民趴下了!!");
构造方法是不是很简单,直接new一个就好
forgroundColorSpan:设置字体颜色。
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#f00fdd"));
BackgroundColorSpan:设置背景颜色
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.parseColor("#c00dfe"));
AbsoluteSizeSpan:设置字体大小。
StyleSpan:设置字体风格,有加粗,斜体
StyleSpan styleSpan1 = new StyleSpan(Typeface.ITALIC);
接下来要做的就是把写好的Span类设置给SpannableStringBuilder就好ImageSpan:设置图片。
ImageSpan imageSpan = new ImageSpan(this,R.mipmap.ic_launcher);
说明一下这几个参数:stringBuilder.setSpan(colorSpan,2,8, Spanned.SPAN_INCLUSIVE_INCLUSIVE); stringBuilder.setSpan(backgroundColorSpan,3,7,Spanned.SPAN_INCLUSIVE_INCLUSIVE); stringBuilder.setSpan(sizeSpan,10,16,Spanned.SPAN_EXCLUSIVE_INCLUSIVE); stringBuilder.setSpan(styleSpan1,1,6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); stringBuilder.setSpan(imageSpan,5,6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(Object what, int start, int end, int flags)
what:就是我们刚刚写的Span类start:开始的位置,
end:结束的位置。如果是图片,一般需要占位SuggestionSpan 。或者空格也行,不然文本会被遮住
flag:取值有如下四个
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
:在 Span前面输入的字符不应用 Span的效果,在后面输入的字符应用Span效果。
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
:在 Span前面输入的字符应用 Span 的效果,在后面输入的字符不应用Span效果。
Spannable.SPAN_INCUJSIVE_INCLUSIVE
:在 Span前后输入的字符都应用 Span 的效果。
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
:前后都不包括。我看资料上是这么说,但是实际测试中好像没有这个效果。我感觉都一样,就没有深究了,达到了效果
然后只需要把SpannableStringBuilder设置给textview就好了
tv.setText(stringBuilder);
看效果
但是呢,这是不是太简单了呢。我们来看看微信朋友圈或者QQ空间类似的地方:
在朋友圈,点击用户名字的时候是去到用户的主页,而点击其他地方是回复功能。
那这点击事件怎么做呢?
google也已经给你想好了:
只需要再写一个Span类就好
ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(MainActivity.this,"日本人地震了!",Toast.LENGTH_LONG).show(); } };
然后设置给SpannableStringBuilder就好
stringBuilder.setSpan(clickableSpan,10,16,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);