有没有更好的办法android文本颜色更改

有没有更好的办法android文本颜色更改,android,android-layout,android-edittext,Android,Android Layout,Android Edittext,我想突出显示编辑文本中的名称, 因此,我有一个包含这些单词的字符串数组。 我创建了以下代码,用于突出显示edittext中写入的单词(如果在单词数组中找到): final Handler handler = new Handler(); final Runnable r = new Runnable() { public void run() { String allText = mac.getText().toString(); for(int

我想突出显示编辑文本中的名称,
因此,我有一个包含这些单词的字符串数组。
我创建了以下代码,用于突出显示edittext中写入的单词(如果在单词数组中找到):

final Handler handler = new Handler();
final Runnable r = new Runnable()
{
    public void run() 
    {
        String allText = mac.getText().toString();
        for(int i=0;i<allText.length();i++){
            for(int j=0;j<darkBlue.length;j++){
                if(allText.indexOf(darkBlue[j])!=-1){
                    Spannable WordtoSpan = new SpannableString(allText);        
                    WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), allText.indexOf(darkBlue[j]), allText.indexOf(darkBlue[j])+darkBlue[j].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    mac.setText(WordtoSpan);
                    mac.setSelection(mac.getText().length());//put the cursor at the end of the text.
                }
            }
        }
        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);   
final Handler=new Handler();
最终可运行r=新可运行()
{
公开募捐
{
字符串allText=mac.getText().toString();

对于(int i=0;i仅将setText和setselection发布到ui线程。所有与ui元素不直接交互的操作都应在另一个线程上完成

当然,您的算法可以得到优化-请参见后面的示例。但更重要的是,正如另一张海报所说,最好将工作转移到另一个线程上d,然后只发布重要的内容。一个常见的误解是,通过在处理程序中发布,您正在另一个线程中运行,事实并非如此。在另一个线程中进行处理,然后只发布操纵UI的部分:(包括一些算法更改,如果不清楚或我完全搞砸了,请告诉我:))

final Handler handler = new Handler();
final Runnable r = new Runnable()
{
    public void run() 
    {
        String allText = mac.getText().toString();
        for(int i=0;i<allText.length();i++){
            for(int j=0;j<darkBlue.length;j++){
                if(allText.indexOf(darkBlue[j])!=-1){
                    Spannable WordtoSpan = new SpannableString(allText);        
                    WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), allText.indexOf(darkBlue[j]), allText.indexOf(darkBlue[j])+darkBlue[j].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    mac.setText(WordtoSpan);
                    mac.setSelection(mac.getText().length());//put the cursor at the end of the text.
                }
            }
        }
        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);   
private void startWork(){
新线程(doWork).start();
}
Runnable doWork=new Runnable(){
while(true){//更改此条件以满足您的需要
对于(int j=0;j 0){)
索引+=(子+长度);
颜色跨度(Color.Blue,(索引-长度),索引);
allText=allText.substring(sub+length);
sub=subText.indexOf(暗蓝色[j]);
}
}
试一试{
睡眠(1000);
}
捕捉(中断异常e){
}
}
}
专用void colorSpan(颜色、最终整数开始、最终整数停止){
handler.post(新的Runnable(){
公开募捐{
字符串allText=mac.getText().toString();
Spannable WordtoSpan=新SpannableString(所有文本);
WordtoSpan.setSpan(新的ForegroundColorSpan(Color.BLUE)、开始、停止、SPAN启用.SPAN_独占性SPAN_独占性);
mac.setText(WordtoSpan);
setSelection(mac.getText().length());
}
});
}
注意:我这么做有点匆忙,如果有任何明显的错误请原谅

final Handler handler = new Handler();
final Runnable r = new Runnable()
{
    public void run() 
    {
        String allText = mac.getText().toString();
        for(int i=0;i<allText.length();i++){
            for(int j=0;j<darkBlue.length;j++){
                if(allText.indexOf(darkBlue[j])!=-1){
                    Spannable WordtoSpan = new SpannableString(allText);        
                    WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), allText.indexOf(darkBlue[j]), allText.indexOf(darkBlue[j])+darkBlue[j].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    mac.setText(WordtoSpan);
                    mac.setSelection(mac.getText().length());//put the cursor at the end of the text.
                }
            }
        }
        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);