1. 程式人生 > >Android一個TextView文字顏色不同或多個關鍵字不同顏色

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);//多關鍵詞多顏色
    }



相關推薦

Android一個TextView文字顏色不同關鍵字不同顏色

今天公司要求一個TextView中有不同的文字顏色 ,比如說:一二三四五一二三四五一二三四五一二三四五,要求一是黃色二是綠色三是紅色其他均是黑色.(哈哈只是個例子別認真)^_^ 針對這樣的問題,灑家真的是腦袋疼,因為以前會寫多個TextView來設定不同的顏色,然後在組合嘛

一個form表單中實現submit不同的action

var ctype 編號 表單 顯示 col 格式 action 否則 在button中用JS的事件綁定onclick實現,如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

Matlab 畫圖實現兩 legend 不同排版

Matlab 提供的 legend 函式,給出的 legend 經常覆蓋了某些曲線(尤其是用 IEEE 模板的時候,一般圖片寬度不超過 315px) 程式: a=linspace(0,2*pi,100); y1=100*sin(a); y2=50*

UE 高亮 一個關鍵字的方法

#######2014-11-20,11:13:06######### 一、高亮一個關鍵字 方法1: 選中該關鍵字, Ctrl + .   即可;  方法2: 選中該關鍵字, Shift  + 雙

Android 一個TextView中設定文字不同字型大小和顏色的最完整方法

在做專案的時候,經常會遇到過一行文字有兩種顏色。有時候直接會想到用多個TextView來實現。今天就介紹一下更為簡單的方法,用一個TextView實現。 效果: 這幾個都實現了一行字有不同顏色,還有兩個字型大小也不一樣,我們下邊一一介紹。 首先xml程

android 一個 textview 設定不同的字型大小和顏色

在實際應用中,需要將一個字串已不同的顏色,字型顯示出來。當然完全可以通過不同textview拼接出來。也可以通過一個textview來展示。 步驟如下:      1.定義不同style . 不妨如下定義2個style <style name="s

Android一個TextView設置多種顏色的2種高效方法

track 能夠 post star strong 價格 show img clas 有時候一個文本框為了強調內容須要顯示不同顏色,用下面代碼能夠輕松實現 方法一:(適用於顏色變化多的情況) //為文本框設置多種顏色 textView=(TextView)fi

Android Studio 打包jar中包含另一個jarjar時解決方案

關於.jar檔案: 平時我們Android專案開發中經常會用到第三方的.jar檔案。 其實.jar檔案就是一個類似.zip檔案的壓縮包,裡面包含了一些原始碼,注意的是.jar不包含資原始檔(res、圖片等) 一、首先學習如何在Android studi

Android一個TextView設定多種顏色的2種高效方法

有時候一個文字框為了強調內容需要顯示不同顏色,用以下程式碼可以輕鬆實現 方法一:(適用於顏色變化多的情況) //為文字框設定多種顏色 textView=(TextView)findViewBy

mysql和mariadb中字段拼接類型有兩字段或者一個字段和一個固定字符串拼接

str1 from 連接 字符串連接 一個 cat str 拼接 str2 MySQL中concat函數 CONCAT(str1,str2,…) 1 .兩個或多個字段連接 例:字段 a,b 表 tb1 語句: select conca

fatal error LNK1169:找到一個重定義的符號

ava 文件中 程序 bsp 由於 nbsp .cn 引用 error 這個算是個比較基礎的問題,由於我不是C程序員,本行java,臨時拉來做的,所以有些坑還得自己走出來。 這個問題是由於,全局變量在a.h中定義,在兩個源文件a.cpp和b.cpp中引用,之後被編譯器

一個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性。

sys date 錯誤 onerror conf erro fig 站點 更新 問題原因可能是: 1. 非空列未插入值錯誤 2. 多個表間外鍵列長度不一樣 3. ef上下文對象db為空 4. ef上下文設置屬性為 db.Configurat

連表查詢(3)之根據相關條件,查詢另外一個表的某字段

兩個 mode object 添加 就會 resultmap control var 多個 1、送檢單位 代理商是從代理商表中取得數據 銷售人員從銷售表中取得數據 說一個簡單的思路: sql語句找到連接兩個表的條件,把另外一個表要用到的字段 寫一個 <re

js 獲取url的參數值 一個參數

run -c www cno spl http 獲取url參數 strong ear 以下JS函數用於獲取url參數: 1 function getQueryVariable(variable) 2 { 3 var query = window.loc

fatal error LNK1169: 找到一個多重定義的符號

編譯 gpo .cpp post 多重 print use 控制 包含 在vs中,使用c時,由編譯-鏈接,cpp之間是自動的,如: 1,頭文件 x.h: 1 int f(); 2,實現 impl.cpp: 1 #include "stdafx.h" 2 3 int

Object.assign() 從一個源對象復制到目標對象

bject 待完善 示例 ces sign java script {} clas Object.assign()方法用於將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。它將返回目標對象。 1、語法: Object.assign(target, ... , sourc

js將數組中一個字段相同的子元素中合並

++ body 遇到 return json 合並 arr 可能 var 最近js中遇到js將數組中一個或多個字段相同的子元素中合並,相信很多朋友也有遇到,大家可能有多種方法,我在這裏記錄一個相對簡單的方法,當然大家如有其它更好的方法,請提出來大家共同學習。 //將經濟事

js 一個一維數組,算出元素之間相互組合的所有情況

urn each pre 相互 get function post data nta // 數據源 var target = { state1: [‘1‘, ‘2‘], state2: [‘01‘, ‘02‘, ‘03‘],

Windows無法安裝到這個磁盤下,分區包含一個不支持安裝的動態卷

windows安裝 動態磁盤 解決方案:1.系統安裝盤 2.WinPE 基本操作如下: shift+F10 # 進入命令行環境diskpart # 進入diskpart命令環境list diskpart #顯示基本磁盤信息select disk n(磁盤號)

一例對一個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性的解決

tro https span cep 實例 tps lte .data 防止 這個問題相信只要是做MVC的,都碰到過,也都知道錯誤的原因,就是觸發了定義的實例字段校驗規則。比如定義的不為空,但是為空了,或者定義的字段長度為50,但是超過50了。 可是有時雖然知道是這樣,