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: ...
随机推荐
- trie树的建立方法汇总
方法一:孩子兄弟表示法 即对于某一个点,记录他的第一个孩子以及他的同父亲的下一个儿子. 具体代码如下: #include <cstdio> #include <cstring> ...
- 模板列onclick事件中绑定跳转页参数(onclick location.href Eval)
<asp:GridView runat="server" ID="gvCheckList" AutoGenerateColumns="false ...
- 每天一个percona 工具 --- pt-kill
主要用途:pt-kill是用来kill MySQL连接的一个工具,在MySQL中因为空闲连接较多导致超过最大连接数,或某个有问题的sql导致mysql负载很高时,需要将其KILL掉来保证服务器正常运行 ...
- mongodump 备份
规划 副本集,其中加了个隐藏节点,用来做备份,所以备份脚本直接在隐藏节点做,目前数据不大,直接本机磁盘存储,后续如果数据集大,那么在本地存最近一天的备份,远程根据需求存储几天的备份 创建备份用户 db ...
- UDP传输
@@@基于UDP的客服端代码 public class Service { // 服务器 public static void main(String[] args) { DatagramPacket ...
- 实验一 DOS命令解释程序的编写
一.目的和要求 1. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: (3)掌握简单的DOS调用方法: (4)掌握C语言编程初步. 2.实验要求 编写类似于DOS,UNIX的命令行解释程 ...
- Selenium的延迟等待
http://my.oschina.net/u/928852/blog/98885 Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wa ...
- 更改星级评分条 RatingBar 的样式
1.首先在布局中引用星级评分条: <RatingBar android:id="@+id/room_ratingbar" styl ...
- k8s volume
只有nfs和rbd的,本人翻译确实很渣 在容器中磁盘文件寿命是短暂的,当在容器中运行一些重要程序时,这会产生一些问题. 首先,当一个容器崩溃后,kubelet将重新启动该容器, ...
- Calculator(1.5)
Calculator(1.5) Github链接 ps.负数的处理未完成 解题过程中遇到的困难和解决 <stack>的使用: 认真研究了栈,基本上掌握了用法,与<queue>的 ...