开发中经常会用到在TextView中为了醒目而设置不同颜色,尤其在搜索功能中,可以使用下面的工具类:
package com.ww.util;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
/**
* TextView指定位置或字段设置指定颜色
*/
public class StringColorUtil {
private Context mContext;
private SpannableStringBuilder spBuilder;
public StringColorUtil(Context context) {
this.mContext = context;
}
/**
* //单个关键字
* <p>
* //设置在wholeStr中第一次出现的keyStr的颜色
* <p>
* //@param wholeStr 全部文字
* <p>
* //@param keyStr 关键字
* <p>
* //@param keyStrColor 关键字的颜色
*/
public StringColorUtil fillColor(String wholeStr, String keyStr, int keyStrColor) {
if (!TextUtils.isEmpty(wholeStr) && !TextUtils.isEmpty(keyStr) && wholeStr.contains(keyStr)) {
int start = wholeStr.indexOf(keyStr);
int end = start + keyStr.length();
spBuilder = new SpannableStringBuilder(wholeStr);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(mContext.getResources().getColor(keyStrColor));
spBuilder.setSpan(foregroundColorSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
return this;
} else {
return null;
}
}
/**
* //多个关键字
* <p>
* //设置在wholeStr中第一次出现的keyStr的颜色
* <p>
* //@param wholeStr 全部文字
* <p>
* //@param keyStrMap key:关键字Value:颜色
*/
public StringColorUtil fillColorByStr(String wholeStr, HashMap keyStrMap) {
if (!TextUtils.isEmpty(wholeStr)) {
spBuilder = new SpannableStringBuilder(wholeStr);
Set keySet = keyStrMap.keySet();//将Map中所有的键存入到set集合中
for (Object keyStr : keySet) {
if (!TextUtils.isEmpty((String) keyStr) && wholeStr.contains((String) keyStr)) {
CharacterStyle charaStyle = new
ForegroundColorSpan(mContext.getResources().getColor((Integer) keyStrMap.get((String) keyStr)));
int start = wholeStr.indexOf(keyStr.toString());
int end = start + keyStr.toString().length();
spBuilder.setSpan(charaStyle, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return this;
} else {
return null;
}
}
/**
* //多个关键字
* <p>
* //设置指定位置的keyStr的颜色
* <p>
* //@param wholeStr 全部文字
* <p>
* //@param keyStringInfos 关键字的一些信息(起始位置,结束位置,颜色值)
*/
public StringColorUtil fillColorByIndex(String wholeStr, List keyStringInfos) {
if (!TextUtils.isEmpty(wholeStr)) {
spBuilder = new SpannableStringBuilder(wholeStr);
for (Object keyStringInfo : keyStringInfos) {
int start = ((KeyStringInfo) keyStringInfo).getStart();
int end = ((KeyStringInfo) keyStringInfo).getEnd();
if (start >= 0 && end < wholeStr.length() && start <= end) {
CharacterStyle charaStyle = new
ForegroundColorSpan(mContext.getResources().getColor(((KeyStringInfo) keyStringInfo).getColor()));
spBuilder.setSpan(charaStyle, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return this;
} else {
return null;
}
}
/**
* 获取修改后的结果(直接设置即可,千万不要 toString )
*/
public SpannableStringBuilder getResult() {
if (spBuilder != null) {
return spBuilder;
}
return null;
}
public static class KeyStringInfo {
//起始位置,结束位置,颜色值
int start;
int end;
int color;
public KeyStringInfo(int start, int end, int color) {
this.start = start;
this.end = end;
this.color = color;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
}
}
其中注意通过getResult()拿到结果后直接设置,不要进行toString()处理!