SpannableString的一个奇怪的问题

今天使用spannableString遇到一个奇怪的问题,就是在setspan的时候,原本可以写成

1 spannableString.setSpan(new RelativeSizeSpan(0.5f), stringsize + 2,
2                     2 + stringsize + 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
3             spannableString.setSpan(new ForegroundColorSpan(Color.LTGRAY),
4                     stringsize + 2, 2 + stringsize + 1,
5                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
6             textView_next_distance.setText(spannableString);

这种形式,注意setSpan后边有设置字体大小(new RelativeSizeSpan(0.5))的一个object,和设置文字颜色(new ForegroundColorSpan(Color.LIGRAY))的object。因为后边用这个字体大小和颜色的文字很多,因此我就在把这个object实例化到了成员变量里,统一使用和修改。

1 private RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(0.5f);
2     private ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(
3             Color.LTGRAY);

但这样问题就出现了,当在同一个textview中使用两次相同的成员变量时,前一个改变的文字就无效了。

正确的写法应该是第一个 使用成员变量里的,如果有第二个或第三个那就再new新的,如下就没有问题

 1 // 道路指引,路段剩余距离
 2             String strDistance = naviInfo.getCurStepRetainDistance() + "";
 3             stringsize = strDistance.length();
 4             spannableString = new SpannableString("前方" + strDistance + "米"
 5                     + ConsUtil.strActions[naviInfo.m_Icon]);
 6             spannableString.setSpan(relativeSizeSpan, 0, 2,
 7                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 8             spannableString.setSpan(foregroundColorSpan, 0, 2,
 9                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
10             spannableString.setSpan(new RelativeSizeSpan(0.5f), stringsize + 2,
11                     2 + stringsize + 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
12             spannableString.setSpan(new ForegroundColorSpan(Color.LTGRAY),
13                     stringsize + 2, 2 + stringsize + 1,
14                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
15             textView_next_distance.setText(spannableString);

 

效果如图:

错误的做法是

 1 // 道路指引,路段剩余距离
 2             String strDistance = naviInfo.getCurStepRetainDistance() + "";
 3             stringsize = strDistance.length();
 4             spannableString = new SpannableString("前方" + strDistance + "米"
 5                     + ConsUtil.strActions[naviInfo.m_Icon]);
 6             spannableString.setSpan(relativeSizeSpan, 0, 2,
 7                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 8             spannableString.setSpan(foregroundColorSpan, 0, 2,
 9                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
10             spannableString.setSpan(relativeSizeSpan, stringsize + 2,
11                     2 + stringsize + 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
12             spannableString.setSpan(foregroundColorSpan,
13                     stringsize + 2, 2 + stringsize + 1,
14                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
15             textView_next_distance.setText(spannableString);

结果就只有后面的样式有效,前面的自动恢复为默认样式

如图:

至于为什么会这样还不太清楚,这个需要研究源码才能得知,现在在加班,如果以后查出来了,后续我会 把原因补上。

 

我的github地址:https://github.com/dongweiq/study

欢迎关注,欢迎star o(∩_∩)o 。有什么问题请邮箱联系 dongweiqmail@gmail.com qq714094450

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值