概述

我们在做项目的过程中经常需要关键字高亮来提醒用户。 就比如我们在ide中一些系统级的关键字会以不同的颜色来展示一样。

最近我看设计图中有一个很眼熟的效果,由于之前写过但是没有留下任何痕迹,所以这次又写了一个工具类。记录一下,方便以后的使用。

  /**     *     * @param text  文字的总内容     * @param indexStr 关键字的内容     * @param color  关键字的颜色     * @return     */    public SpannableStringBuilder setColor(String text, String indexStr, int color) {        //  记录关键字的次数 与他在整个字符中所占的索引位置        String[] deStr = text.split(indexStr);        ArrayList 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]

这个问题在以上的方法体中已经做过处理了。

更多相关文章

  1. android: Error:元素内容必须由格式正确的字符数据或标记组成
  2. React Native 中的状态栏(Android沉浸式)
  3. 7种例子讲解Android(安卓)Dialog!
  4. 使用内容提供器跨应用分享你的数据(1)
  5. Andriod内嵌HTML5项目构建以及整包更新配置
  6. scrollTo和getScrollY表象和源码结合效果更佳!
  7. [置顶] 为学Android,我看了这些书
  8. latex/Xelatex书籍排版总结---顺便附上一本排好的6寸android书…
  9. Android中仿QQ聊天内容中提取电话号码,URL

随机推荐

  1. JQuery UI自动完成(1.8)滚动
  2. jQuery Ui Draggable在移动端浏览器不起
  3. jquery简单笔记(1)
  4. ajax with select tag rails 4
  5. 加载函数加载页面但不能对数据执行任何操
  6. jQuery-对Select的操作集合
  7. 用jquery技术实现table的奇数行变色
  8. JQuery自动完成功能不会显示所有结果
  9. 在发出xml Ajax请求时获取错误412
  10. jQuery向父级元素最前面添加元素—prepen