• 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

  • 相关阅读:
    CentOS进程资源占用高原因分析命令
    Centos下修改启动项和网络配置
    CentOS查看系统信息命令和方法
    [vim]设置vim语法高亮显示和自动缩进
    [vim]vim中有中文乱码
    setState回调
    服务器安装nginx
    小程序map
    后台合成图片
    阿里云服务器添加nginx
  • 原文地址:https://www.cnblogs.com/dongweiq/p/4621970.html
Copyright © 2020-2023  润新知