Android TextView中文字设置不同的颜色,设置指定文字指定颜色

开发中经常会用到在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()处理!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值