概述
我們在做項目的過程中經常需要關鍵字高亮來提醒用戶。 就比如我們在ide中一些系統級的關鍵字會以不同的顏色來展示一樣。
最近我看設計圖中有一個很眼熟的效果,由於之前寫過但是沒有留下任何痕跡,所以這次又寫了一個工具類。記錄一下,方便以後的使用。
/**
*
* @param text 文字的總內容
* @param indexStr 關鍵字的內容
* @param color 關鍵字的顏色
* @return
*/
public SpannableStringBuilder setColor(String text, String indexStr, int color) {
// 記錄關鍵字的次數 與他在整個字符中所佔的索引位置
String[] deStr = text.split(indexStr);
ArrayList<Entity> objects = new ArrayList<>(deStr.length);
int cycleSize = text.endsWith(indexStr) ? deStr.length : deStr.length - 1;
for (int i = 0; i < cycleSize; i++) {
Entity entity = new Entity();
int index;
if (i == 0) {
index = text.indexOf(indexStr);
} else {
Entity entity1 = objects.get(i - 1);
index = text.indexOf(indexStr, entity1.end);
}
entity.start = index;
entity.end = index + indexStr.length();
objects.add(entity);
}
//根據索引集合 來設置關鍵字 字體顏色
SpannableStringBuilder builder = new SpannableStringBuilder(text);
for (int i = 0; i < objects.size(); i++) {
//這個實例設置一次關鍵字的時候就要重新實例一次
ForegroundColorSpan redSpan = new ForegroundColorSpan(color);
builder.setSpan(redSpan, objects.get(i).start, objects.get(i).end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return builder;
}
private static volatile TextSpanUtil mTextSpanUtil;
public static TextSpanUtil getInstant() {
if (null == mTextSpanUtil) {
synchronized (TextSpanUtil.class) {
if (null == mTextSpanUtil) {
mTextSpanUtil = new TextSpanUtil();
}
}
}
return mTextSpanUtil;
}
public class Entity {
public int start;
public int end;
@Override
public String toString() {
return "Entity{" +
"start=" + start +
", end=" + end +
'}';
}
}
這裏需要注意的是。因爲我們用的是split 分隔符,所以如果關鍵字在整個字段末尾的話是不會多出一個字段的。 但如果是在首位就不會出現問題。
舉個栗子: 如果內容爲
“關鍵字abc關鍵字edfg關鍵字hi關鍵字j”
那麼分割的內容爲
[, abc, edfg, hi, j]
如果關鍵字在末尾
“abc關鍵字edfg關鍵字hi關鍵字”
那麼結果爲:
[abc, edfg, hi, j]
這個問題在以上的方法體中已經做過處理了 。