在应用开发中时常会遇到需要在一段文字中插入几个不一样颜色文字的需求;

以前本人都是用多个TextView拼起来,不仅感觉很蠢,操作起来也蛮恶心;

直到接触到了SpannableStringBuilder,感觉整个人都好了;

在我搭建界面布局,会有一些带String占位符的默认文字,如:"现在的气温是:%s","今天天气:%1$s,最高气温:%2$s,最低气温:%3$s,降雨率:%4$s,pm2.5:%5$s.";

之后在获取到数据时,直接String.format(String target, String... data),就能在对应位置插入数据;

最近遇到一个插入的数据还要换成另一种颜色的需求,觉得这个需求应该比较常见,所以就写了个工具类;

 /**
* TextView色彩工具类
* Created by me on 2015-08-10.
*/
public class TextViewColorUtil { /**
* 在文字内容为"xxxxx%sxxxx"(一个格式化占位符)或"xxxx%1$sxxxx%2$x......xxxx%n$sxxxx"时(多个格式化占位符),完成格式化同时,设置新加入的文字颜色,同时也能够设置原来文字的颜色;
* <p/>
* 注:请务必保证单个格式化时,使用%s占位符;多格式化时,使用%n$s占位符;
* 占位符数必须和想填入的字符串数目一致;
*
* @param texts 如果可变参数长度为0,不做处理;如果文字长度为0,默认为""
* @param defaultColorId R.color.xxx 如果不想改变默认颜色(冒号前的文字颜色),可以填null
* @param newContentColorId R.color.xxx
*/
public static void setSubColorText(Context context, TextView tv, Integer defaultColorId, int newContentColorId, String... texts) { if (texts != null) {
if (texts.length == 1) {//单格式化参数情况
if (defaultColorId != null)//1.如果有设置改编默认文字颜色,给予改变
tv.setTextColor(defaultColorId); String text = texts[0];
if (StringUtil.isEmpty(text))//2.如果文字内容为null或者长度0,默认其为""
text = ""; String originText = tv.getText().toString();//3.格式化,记录添加的字符串的起止index
int indexStart = originText.indexOf("%s");
int indexEnd = indexStart + text.length();
String foo = String.format(originText, text);
tv.setText(foo); if (indexEnd > indexStart) {//4.如果有必要换色,执行
SpannableStringBuilder style = new SpannableStringBuilder(foo);
style.setSpan(new ForegroundColorSpan(context.getResources().getColor(newContentColorId)), indexStart, indexEnd, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.setText(style);
} } else if (texts.length > 1) {//多格式化
if (defaultColorId != null)//1.如果有设置改编默认文字颜色,给予改变
tv.setTextColor(defaultColorId); int[] indexesStart = new int[texts.length];
int[] indexesEnd = new int[texts.length];
String originText = tv.getText().toString(); for (int i = 0; i < texts.length; i++) {
String text = texts[i];
if (StringUtil.isEmpty(text)) {//2.如果文字内容为null或者长度0,默认其为""
text = "";
} String regular = "%" + (i + 1) + "$s";//3.格式化,记录添加的字符串的起止index
indexesStart[i] = originText.indexOf(regular);
if (i > 0) {
int indexFix = 0;
for (int j = 0; j <= i - 1; j++) {
String formerRegular = "%" + (j + 1) + "$s";
indexFix += (indexesEnd[j] - indexesStart[j]) - formerRegular.length();
}
indexesStart[i] += indexFix;
}
indexesEnd[i] = indexesStart[i] + text.length();
}
String foo = String.format(originText, (Object[]) texts);
tv.setText(foo);
SpannableStringBuilder style = new SpannableStringBuilder(foo);
for (int i = 0; i < texts.length; i++) {
if (indexesEnd[i] > indexesStart[i])//4.如果有必要换色,执行
style.setSpan(new ForegroundColorSpan(context.getResources().getColor(newContentColorId)), indexesStart[i], indexesEnd[i], Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
tv.setText(style);
}
}
}
}

Code

目前只有一种颜色,如果有每个插入的数据还要不同色彩的需求...也蛮好改的.

把传入的参数int newContentColorId换成int[] newContentColorIds然后稍微改改逻辑就ok啦.

>_>

就以之前的两个例子举例吧:

1.

 textView.setText("现在的气温是:%s");
TextViewColorUtil.setSubColorText(MainActivity.this, textView, null, R.color.blue,"3°c");

"现在的气温是:%s"

2.

 tv.setText("今天天气:%1$s,最高气温:%2$s,最低气温:%3$s,降雨率:%4$s,pm2.5:%5$s.");
TextViewColorUtil.setSubColorText(MainActivity.this, tv, null, R.color.red, "晴", "22°c", "9°c", "47%", "19");

"今天天气:%1$s,最高气温:%2$s,最低气温:%3$s,降雨率:%4$s,pm2.5:%5$s."

Android TextView设置多彩文字的更多相关文章

  1. android TextView 设置部分文字背景色和文字颜色

    通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { ...

  2. android TextView 设置部分文字背景色 和 文字颜色

    通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  3. TextView 设置部分文字颜色及点击事件SpannableString

    设置TextView中一部分文字的颜色及点击事件. SpannableString gotoMsgListStr = new SpannableString("消息列表"); go ...

  4. Android TextView 设置行间距

    Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...

  5. android textview改变部分文字的颜色和string.xml中文字的替换(转)

    转   :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...

  6. Android TextView设置个别字体样式

    TextView进一步深化:       Textview 能够对其文字进行格式化.       通过查询资料,了解到格式化文字的方式主要分为两大类:  第一类:HTML标签格式化文字      代码 ...

  7. Android textview 设置不同的字体大小和颜色

    在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...

  8. android TextView 设置字体大小

    package com.example.yanlei.yl4; import android.graphics.Color;import android.os.Bundle;import androi ...

  9. android textview 设置不同的颜色和大小

    1.定义不同的style <style name="approval_detail_info_style1"> <item name="android: ...

随机推荐

  1. Mongodb 故障分享 初始化时"errmsg" : "exception: new file allocation failure" 并且长时间处于STARTUP2

    Hello,大家下午好. 近几天的项目有点赶,所以耽误了更新.现在给大家分享下,在安装mongodb的过程中,遇到的故障一则.其实很小白的问题,当时遇到这个问题的时候比较心慌,浪费了很多时间,跟大家分 ...

  2. [整]磁盘 I/O 性能监控指标和调优方法

    在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能. 磁盘 I/O 性能监控的指标主要包括: 指标 1:每秒 I/O 数(IOPS 或 t ...

  3. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试 [T]

    SQL Server 2008中SQL应用系列--目录索引 前些天看到一篇文章<SQL Server 2012 - Server side paging demo using OFFSET/FE ...

  4. batchInsert xml 配置 ibatis

    <insert id="tops_visa_openapi_jvisaproduct.batchinsert" parameterClass="java.util. ...

  5. jquery为什么提倡使用.on绑定,.off移除组合代替.live和.die组合呢?

    .live绑定的是固定的Document的节点,在树形节点中,如果节点较多,层级查询影响效率: .on绑定的是$(selector),可自由改变嵌套层级问题,效率高: 列举两种on可以绑定多个事件的方 ...

  6. tweenmax.js 文档

    TweenMax 参考http://bbs.9ria.com/thread-214959-1-1.html TweenMax 可能是很多人都用的,包括我 但 是最近发现大量的运用就总会产生这样或那样的 ...

  7. JAVA中的类和接口

    1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...

  8. 【FPGA】【代码】资源优化,结构优化

    资源优化 原始资源 定义时初始化和复位电路初始化都起作用,删除定义的初值后 将always块描述的组合逻辑变为时序逻辑后

  9. jQuery判断网页中的id是否有重复的

    From:http://blog.csdn.net/china_skag/article/details/6915323判断网页中的ID是否有重复的:指定ID判断 $(function(){ $(&q ...

  10. Mybatis使用generator自动生成映射配置文件信息

     使用mybatis配置映射文件比较的麻烦,但是有自动生成jar工具,方便加速开发速度,下面主要是该工具的使用以及相关的配置. 1.下载相关的资源 我们需要下载mybatis-generator-co ...