Android TextView设置多彩文字
在应用开发中时常会遇到需要在一段文字中插入几个不一样颜色文字的需求;
以前本人都是用多个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设置多彩文字的更多相关文章
- android TextView 设置部分文字背景色和文字颜色
通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { ...
- android TextView 设置部分文字背景色 和 文字颜色
通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- TextView 设置部分文字颜色及点击事件SpannableString
设置TextView中一部分文字的颜色及点击事件. SpannableString gotoMsgListStr = new SpannableString("消息列表"); go ...
- Android TextView 设置行间距
Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...
- android textview改变部分文字的颜色和string.xml中文字的替换(转)
转 :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...
- Android TextView设置个别字体样式
TextView进一步深化: Textview 能够对其文字进行格式化. 通过查询资料,了解到格式化文字的方式主要分为两大类: 第一类:HTML标签格式化文字 代码 ...
- Android textview 设置不同的字体大小和颜色
在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...
- android TextView 设置字体大小
package com.example.yanlei.yl4; import android.graphics.Color;import android.os.Bundle;import androi ...
- android textview 设置不同的颜色和大小
1.定义不同的style <style name="approval_detail_info_style1"> <item name="android: ...
随机推荐
- java 平面上最近两个点之间的距离
public class ClosestPair{ public static void main(String[] args) { float[][] a = new float[][]{{3, 3 ...
- explain 执行计划详解
id:id是一组数字,表示查询中执行select子句或操作表的顺序,如果id相同,则执行顺序从上至下,如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行. id列为null的就表是这是 ...
- iOS:didSelectRowAtIndexPath:方法失效解决办法
问题描述及解决过程: 为了达到点击TableView空白区退出键盘的效果,给控制器注册了一个UITapGestureRecognizer来识别点击事件,代码如下: #pragma mark - 设置手 ...
- performSelector和performSelectorInBackground
前者是在主线程下完成的, 不会自动创建一个线程. 后者会创建一个新的线程.
- Eclipse 创建maven项目
新建maven project
- 在数据库中varchar与char的区别
char是固定长度类型 varchar是可变的长度类型 char和varchar类型相似,但是它们的存储和检索方式不同.在MySQL5.0.3,它们在最大长度和是否保留尾部空格也不相同. char和v ...
- <java基础学习>02JAVA的基础组成
Java的基础组成 1 关键字 (被赋予了特殊含义的单词) 2 标识符 3 注释 4 常量和变量 5 运算符 6 语句 7 函数 8 数组 关键字 class Demo{ public static ...
- centos下搭建lamp环境
1 在线安装所有的服务 yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-p ...
- Mybatis中#{}和${}传参的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111&qu ...
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)
1.3.2 MFC如何使用应用程序对象 MFC程序没有main函数,没有WinMain函数,到底是什么启动了程序的运行? 一个MFC提供的源代码中(Winmain.cpp)包含了一个AfxWinMai ...