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 。有什么问题请邮箱联系 [email protected] qq714094450

时间: 2024-11-23 21:59:08

SpannableString的一个奇怪的问题的相关文章

做一个手机端页面时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致

最近在做一个手机端页面时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致.大家可以查看这个Demo(记得打开Chrome DevTools). 就如上图所示,你可以发现,原本指定的字体大小是24px,但是最终计算出来的却是53px,看到这诡异的结果,我心中暗骂一句:这什么鬼! 随后开始对问题各种排查:某个标签引起的?某个CSS引起的?又或者是某句JS代码引起的.通过一坨坨的删代码,发现貌似都不是.我不禁又骂,到底什么鬼!不过中间还是发现了一些端倪:当页面中的标签数量或者文本数

一个奇怪的JS函数

今天在分析一个jQuery插件源码的时候,发现了一个奇怪的函数. // add leading zeros var pad = function(x){return (1e15+""+x).slice(-2)}; 首先1e15是什么意思? 也不是十六进制表示法. 不管三七21,直接F12打开命令窗口,执行下看看,结果是1后面有15个0. 原来1e15是科学计数法,表示1乘以10的15次方. var y=123e5; // 12300000 var z=123e-5; // 0.0012

测试一个奇怪的问题

我是一个中国人的老师. 测试一个奇怪的问题,布布扣,bubuko.com

一个奇怪的问题

在网络线程中接收并解析出来的信息 用一个 全局的 CCString(其实就是C++ std::string的封装) 接成功,但是在UI线程中使用这个全局的变量时候,却显示不出来(经验证不为空)刚开始以为是多线程操作的问题呢,然后调用 scheduleOnce(schedule_selector(Arena::initFillLeftRoleMessage), 0 );也不行 ,最后实在没办法了用int 类型的全局变量去接收,结果神奇的事情出现了,可以显示了. 一个奇怪的问题

asp中的一个奇怪的函数

/* 豆腐制作 都是精品 http://www.asp888.net 豆腐技术站 如转载 请保留版权信息 */ asp中有很多的文章在研究如何提高asp程序的执行效率,我们 得出结论 在<% 和 %> 之间的代码执行的速度要高于 在这个 标签之外的代码,我们有没有想过 如何重复的利用这些在标签之外的代码呢? 有的人可能觉得 这个没有什么意义!但是我们可以 怀着 一种很轻松的心态来看看下面这个例子,看看 我们得到了什么有趣的现象!在这个例子中,我们用到了 MSDN 中没有介绍的 WriteBlo

tomcat的webappclassloader中一个奇怪的异常信息

如果一个应用抛出大量的Class not found信息,一般你会怀疑包冲突.可是tomcat的webappclassloader却有这样的问题: 如果一个应用发布出现问题, webappclassloader的started属性被设为false.然后其它线程如果继续使用webappclassloader进行class load,则大量的Class not found异常 被抛出: 1391       public Class loadClass(String name, boolean re

一个奇怪的问题:Last_Errno: 1264 Error &#39;Out of range value for column 0x322E36343030

场景环境: 1. 主从都是:Server version: 5.7.16-log MySQL Community Server (GPL) 2.操作系统:CentOS release 6.7 (Final) 3.业务端通过SAS软件,向改主库中批量写入几百条数据. 接到报警,发现从库show slave status \G; 有如下报警 Last_Errno: 1264 Last_Error: Error 'Out of range value for column 'loan_amount'

一个奇怪的bug

之前遇到一个奇怪的bug,现在正好时间比较多,就想把它记录下来. 是关于一个日历控件的bug. 点击团期,会弹出日历控件的弹窗,控件的界面展示大概是这样子的:第一排是周几(从周日到周六依次排列,这部分是开发人员写死的),再下面是调用的系统的日期.bug详细描述:更换系统语言,如改成English(UK),假设原本今天应该是周四,更改与语言之后.今天就变成周三了. 原因是:对于美国而言,周日是作为每周的第一天,而对于英国,周一是每周的第一天,这样更改完语言之后,就发生了上面的bug.后来开发人员修

自己yy的一个奇怪东西

散步的时候yy区间最值的不同分块做法,发现单点修改\(O(\sqrt{n})\)查询\(O(1)\)的做法不是很会? 于是yy了一个奇怪做法,写出来看看. 考虑查询的时候两端的散点可以用前后缀最值查出来,所以只需要考虑中间的块. 中间这些块似乎比较恶心,不知道怎么做. 于是我们把每一个块的最值拎出来作为一个点,再分一次块,就成功地用\(O(1)\)的时间把问题变成了根号级别的子问题. 于是分块套分块套分块套--,似乎很对? 如果左右端点都在同一个块内那么不是很好玩,就对每一个块里面也分块,也是一