android修改TextView中部分文字的顏色來實現高亮效果【親測有效】

概述

我們在做項目的過程中經常需要關鍵字高亮來提醒用戶。 就比如我們在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]

這個問題在以上的方法體中已經做過處理了 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章