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

来源:互联网 发布:apache开启rewrite 编辑:程序博客网 时间:2024/06/09 00:26

今天公司要求一个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);//多关键词多颜色    }




1 0
原创粉丝点击