Android一个TextView文字颜色不同或多个关键字不同颜色

今天公司要求一个TextView中有不同的文字颜色

,比如说:一二三四五一二三四五一二三四五一二三四五,要求一是黄色二是绿色三是红色其他均是黑色.(哈哈只是个例子别认真)^_^

针对这样的问题,洒家真的是脑袋疼,因为以前会写多个TextView来设置不同的颜色,然后在组合嘛,现在觉得这个办法简直Low不过,当时确实解决了问题.

现在突然这样要求之后发现,再去创建不同TextView不仅资源浪费而且还能活活把人累死,偶然想起一次公司配合html写的TextView文字变色突发奇想,写了一个自定义控件,因为是临时写的又怕下了班懒,不写博客.特此记下.这个控件不仅完成了支持一个TextView可以改变某一个关键词的颜色,还支持一个TextView可以有多个关键字且关键字颜色不同.

先看两张效果图吧

.单个关键词多个关键词,这些可都是一个TextView.







那么废话不多说,给大家共享我的源码,写的菜的地方也希望大神指出来,共同进步~~

/**
 * Created by wanghan on 2016/11/2.
 */
public class PartColorTextView extends TextView {
    private final String SRM="<font color=\"⊙\">%1$s</font>";//文字转换Hmtl的格式固定不要动
    private final String OF="⊙";//替换颜色的字符


    public PartColorTextView(Context context) {
        super(context);
    }

    public PartColorTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PartColorTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    /**
    *@author WangHan
    *创建时间:2016/11/2 14:38
    *方法名:setPartText
    *描述: 給文字顏色設置
    *参数:allText:全部文字 keyText:变色关键字 otherTextColor:默认文字颜色 keyTextColor:要变颜色的字的颜色必须是个Color(getRe.getColor.)这样获得
    *返回值:
    *特殊注释:该方法适合只有一个关键词的时候
    */
    public void setPartText(String allText,String keyText,int otherTextColor,int keyTextColor)
    {
        String NF = String.format("#%06X", 0xFFFFFF & keyTextColor);
        String replace = SRM.replace(OF, NF);
        String format = String.format(replace, keyText);
        try {
            String textStr = allText.replaceAll(keyText, format);
            Spanned spanned = Html.fromHtml(textStr);
            setTextColor(otherTextColor);
            setText(spanned);
        }catch (PatternSyntaxException e)
        {
            e.printStackTrace();
        }
    }
    /**
     *@author WangHan
     *创建时间:2016/11/2 14:38
     *方法名:setPartText
     *描述: 給文字顏色設置
     *参数:allText:全部文字 keyColorMap:用于一段话有多个,且颜色要求不同的集合,Key是关键字,Value是Color  keyTextColor:要变颜色的字的颜色必须是个Color(getRe.getColor.)这样获得
     *返回值:
     *特殊注释:该方法适合一段话有多个关键词的时候
     */
    public void setPartText(String allText,HashMap<String,Integer> keyColorMap,int otherTextColor)
    {
        Spanned spanned = null;
        String textStr=null;
        Set<String> keySet = keyColorMap.keySet();
        for (String s : keySet) {
            String NF = String.format("#%06X", 0xFFFFFF & keyColorMap.get(s));
            String replace = SRM.replace(OF, NF);
            String format = String.format(replace, s);
            try {
                if (textStr==null)
                {
                    textStr  = allText.replaceAll(s, format);
                }else
                {
                    textStr=textStr.replaceAll(s, format);
                }
            }catch (PatternSyntaxException e)
            {
                e.printStackTrace();
            }
        }
        setTextColor(otherTextColor);
        spanned= Html.fromHtml(textStr);
        setText(spanned);
    }
}

附上用法:

public class MainActivity extends AppCompatActivity {
    private PartColorTextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = (PartColorTextView) findViewById(R.id.main_tv);
        String allll="一二三四五一二三四五一二三四五";
        tv1.setPartText(allll,"二",Color.BLACK,getResources().getColor(R.color.colorAccent));//单个关键词参数:全部文本,关键字文本,全部文本颜色,关键字文本颜色
<span style="font-family: Arial, Helvetica, sans-serif;">    }</span>
}


   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = (PartColorTextView) findViewById(R.id.main_tv);
        String allll="1.    关闭Autotuning(自动调整)\n" +
                "    禁用这个可以帮助dns查找和网络发现。禁用方法和vista差不多。\n" +
                "    admin权限下在命令提示符里打:\n" +
                "    Netsh interface tcp set global autotuning=disabled\n" +
                "    然后应该会显示OK。要检查执行结果的话,再输入\n" +
                "    Netsh interface tcp show global\n" +
                "    (应该是第五行)可以看到recieve window auto-tuning level的对应项是disabled就是了。\n" +
                "    这个方法对vista也有提速效果。";
        HashMap<String, Integer> keysColor = new HashMap<>();//参数之一:key:关键字 Value:颜色  但一定是Color(int)的.如果是#ffffff这样的话建议还是写在color资源包中,个人习惯.
        keysColor.put("Autotuning", Color.GREEN);
        keysColor.put("Netsh",Color.RED);
        keysColor.put("OK",Color.BLUE);
        keysColor.put("禁用",Color.GRAY);
        keysColor.put("dns",Color.CYAN);
        tv1.setPartText(allll,keysColor,Color.BLACK);//多关键词多颜色
    }




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值