android stringbuilder 清空,Android-TextView进阶用法之SpannableStringBuilder

原创-转载请注明出处。

TextView进阶用法

在Android中TextView是我们最熟悉不过的控件了,但是它的进阶用法你知道多少呢?下面就来聊一聊TextView的进阶用法。

1.显示多种颜色

在做项目中经常会遇到一行字显示多种颜色的需求。用两个或多个TextView也可以实现,但这样比较费事,而且可能还要多一级布局嵌套。接下来我们需要用到SpannableStringBuilder这个类。

TextView textView = (TextView) findViewById(R.id.textview);

String text = "TextView进阶用法";

SpannableStringBuilder ssb = new SpannableStringBuilder(text);

ssb.setSpan(new ForegroundColorSpan(Color.RED),0,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new ForegroundColorSpan(Color.GREEN),8,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(ssb);

效果如下:

6e9ab528bfb3

TextView多种颜色

SpannableStringBuilder类实现了CharSequence接口,所以可以直接通过setText()设置值,它更像一个StringBuilder,同时也有append()方法。这样的话无论要指定多少颜色,都可以通过setSpan()来根据字符串的索引长度来解决。

注意:

1.参数start为闭区间,end为开区间。即本例中的0,8实际代表从0~7的长度。

2.int flags:取值有如下四个

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式

Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式

Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。

Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。

大家可以自己试下取不同flags时的效果,可以用EditText试验。

2.显示不同大小

将ForegroundColorSpan改为AbsoluteSizeSpan。

ssb.setSpan(new AbsoluteSizeSpan(80),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

3.删除线(StrikethroughSpan)

ssb.setSpan(new StrikethroughSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

4.下划线(UnderlineSpan)

ssb.setSpan(new UnderlineSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

5.加粗斜体(StyleSpan)

粗体:

ssb.setSpan(new StyleSpan(Typeface.BOLD),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

斜体:

ssb.setSpan(new StyleSpan(Typeface.ITALIC),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

6.设置点击事件

ssb.setSpan(new ClickableSpan() {

@Override

public void onClick(View widget) {

Toast.makeText(getApplicationContext(),"被点击了",Toast.LENGTH_SHORT).show();

}

},0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//须调用此方法,不然点击无效

textView.setMovementMethod(LinkMovementMethod.getInstance());

最终效果如下:

6e9ab528bfb3

TextView多种颜色

当然,如果你想及设置点击又设置颜色或下划线的话,ClickableSpan也提供了一个回调方法来设置颜色下划线等属性。

@Override

public void updateDrawState(TextPaint ds) {

ds.setColor(Color.RED);

ds.setUnderlineText(true);

}

附上完整代码

TextView textView = (TextView) findViewById(R.id.textview);

String text = "TextView进阶用法";

SpannableStringBuilder ssb = new SpannableStringBuilder(text);

ssb.setSpan(new ForegroundColorSpan(Color.RED),0,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new ForegroundColorSpan(Color.GREEN),8,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new AbsoluteSizeSpan(80),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new StrikethroughSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new UnderlineSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new StyleSpan(Typeface.BOLD),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new StyleSpan(Typeface.ITALIC),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ssb.setSpan(new ClickableSpan() {

@Override

public void onClick(View widget) {

Toast.makeText(getApplicationContext(),"被点击了",Toast.LENGTH_SHORT).show();

}

@Override

public void updateDrawState(TextPaint ds) {

ds.setColor(Color.RED);

ds.setUnderlineText(true);

}

},0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//须调用此方法,不然点击无效

textView.setMovementMethod(LinkMovementMethod.getInstance());

textView.setText(ssb);

这样就不用担心一段话要写多个TextView的问题了。一个TextView统统搞定!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值