Android TextView设置多彩文字

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

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

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

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

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

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

 1 /**
 2  * TextView色彩工具类
 3  * Created by me on 2015-08-10.
 4  */
 5 public class TextViewColorUtil {
 6
 7     /**
 8      * 在文字内容为"xxxxx%sxxxx"(一个格式化占位符)或"xxxx%1$sxxxx%2$x......xxxx%n$sxxxx"时(多个格式化占位符),完成格式化同时,设置新加入的文字颜色,同时也能够设置原来文字的颜色;
 9      * <p/>
10      * 注:请务必保证单个格式化时,使用%s占位符;多格式化时,使用%n$s占位符;
11      * 占位符数必须和想填入的字符串数目一致;
12      *
13      * @param texts             如果可变参数长度为0,不做处理;如果文字长度为0,默认为""
14      * @param defaultColorId    R.color.xxx 如果不想改变默认颜色(冒号前的文字颜色),可以填null
15      * @param newContentColorId R.color.xxx
16      */
17     public static void setSubColorText(Context context, TextView tv, Integer defaultColorId, int newContentColorId, String... texts) {
18
19         if (texts != null) {
20             if (texts.length == 1) {//单格式化参数情况
21                 if (defaultColorId != null)//1.如果有设置改编默认文字颜色,给予改变
22                     tv.setTextColor(defaultColorId);
23
24                 String text = texts[0];
25                 if (StringUtil.isEmpty(text))//2.如果文字内容为null或者长度0,默认其为""
26                     text = "";
27
28                 String originText = tv.getText().toString();//3.格式化,记录添加的字符串的起止index
29                 int indexStart = originText.indexOf("%s");
30                 int indexEnd = indexStart + text.length();
31                 String foo = String.format(originText, text);
32                 tv.setText(foo);
33
34                 if (indexEnd > indexStart) {//4.如果有必要换色,执行
35                     SpannableStringBuilder style = new SpannableStringBuilder(foo);
36                     style.setSpan(new ForegroundColorSpan(context.getResources().getColor(newContentColorId)), indexStart, indexEnd, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
37                     tv.setText(style);
38                 }
39
40             } else if (texts.length > 1) {//多格式化
41                 if (defaultColorId != null)//1.如果有设置改编默认文字颜色,给予改变
42                     tv.setTextColor(defaultColorId);
43
44                 int[] indexesStart = new int[texts.length];
45                 int[] indexesEnd = new int[texts.length];
46                 String originText = tv.getText().toString();
47
48                 for (int i = 0; i < texts.length; i++) {
49                     String text = texts[i];
50                     if (StringUtil.isEmpty(text)) {//2.如果文字内容为null或者长度0,默认其为""
51                         text = "";
52                     }
53
54                     String regular = "%" + (i + 1) + "$s";//3.格式化,记录添加的字符串的起止index
55                     indexesStart[i] = originText.indexOf(regular);
56                     if (i > 0) {
57                         int indexFix = 0;
58                         for (int j = 0; j <= i - 1; j++) {
59                             String formerRegular = "%" + (j + 1) + "$s";
60                             indexFix += (indexesEnd[j] - indexesStart[j]) - formerRegular.length();
61                         }
62                         indexesStart[i] += indexFix;
63                     }
64                     indexesEnd[i] = indexesStart[i] + text.length();
65                 }
66                 String foo = String.format(originText, (Object[]) texts);
67                 tv.setText(foo);
68                 SpannableStringBuilder style = new SpannableStringBuilder(foo);
69                 for (int i = 0; i < texts.length; i++) {
70                     if (indexesEnd[i] > indexesStart[i])//4.如果有必要换色,执行
71                         style.setSpan(new ForegroundColorSpan(context.getResources().getColor(newContentColorId)), indexesStart[i], indexesEnd[i], Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
72                 }
73                 tv.setText(style);
74             }
75         }
76     }
77 }

Code

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

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

>_>

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

1.

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

"现在的气温是:%s"

2.

1 tv.setText("今天天气:%1$s,最高气温:%2$s,最低气温:%3$s,降雨率:%4$s,pm2.5:%5$s.");
2 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."

时间: 08-27

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

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

通过SpannableStringBuilder来实现,它就像html里边的<span>元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Str

Android TextView 设置行间距的问题 (setLineSpacing ,lineSpacingExtra, lineSpacingMultiplier)

最近的项目中,需要用到自定义控件.有个组件要获取绘制文本的高度,翻开TextView 的源码,有个方法 getLineHeight() public int getLineHeight() { return FastMath.round(mTextPaint.getFontMetricsInt(null) * mSpacingMult + mSpacingAdd); } getLineHeight 的注释如下: /** * @return the height of one standard l

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

设置TextView中一部分文字的颜色及点击事件. SpannableString gotoMsgListStr = new SpannableString("消息列表"); gotoMsgListStr.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { startActivity(new Intent(OrderPayStatusActivity.this, MsgListActivi

Android - TextView 设置行间距、行高

在你要设置的TextView中加入如下代码: 1.android:lineSpacingExtra 设置行间距,如”8dp”. 2.android:lineSpacingMultiplier 设置行间距的倍数,如”1.5″.

Android TextView 设置行间距

Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier. 关于Android下TextView中文换行问题,可查看Android自定义view-文本自动换行. 1.android:lineSpacingExtra设置行间距,如”3dp”. 2.android:lineSpacingMultiplier设置行间距的倍数,如”1.2″

Android TextView 设置文字间距

搜索结果都不靠谱,基本上都说是android:textScaleX可以设置文字间距,也不知道你们到底有没有真正做过开发. Android开发文档里描述的很清楚: android:textScaleX Sets the horizontal scaling factor for the text. 这个东西是用来设置水平方向的文字放大和缩小的. 其实设置文字间距可以通过修改string.xml里的字符,在其中添加空格来实现. 但是在字符串中直接输入空格达不到想要的效果,这就需要使用转义字符来进行转

Android TextView设置个别字体样式

TextView进一步深化: Textview 可以对其文字进行格式化. 通过查询资料,了解到格式化文字的方式主要分为两大类: 第一类:HTML标签格式化文字 代码比较简单,如下: import android.app.Activity; import android.os.Bundle; import android.text.Html; import android.widget.TextView; public class AndroidFronColorTest extends Acti

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

转   :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: Java代码   TextView textView = (TextView)findViewById(R.id.textview); //方法一: textView.setText(Html.fromHtml("<font color=\"#ff0000\">红色</font>其它颜色&

android textview 设置单行最大宽度和ellipsize省略号时整体变短的问题

在 android 的textview中 同时设置 android:maxWidth="155dp"android:lines="1"android:ellipsize="end" 在部分手机上运行时,当textview的长度超过155dp时,会发现最后显示出来的长度并没有达到155dp,甚至还差的很宽,如图 解决方法: 把 android:lines="1" 替换为 android:singleLine="true