有没有更好的方法呢? - android文本颜色变化

时间:2012-04-11 23:32:11

标签: android android-layout android-edittext

我想在edittext中突出显示名称,
所以我有一个带有这些词的字符串数组 我创建了以下代码,如果在单词Array:

中找到它,则会突出显示在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);   

问题是,UI每秒渲染一次,因此不让我与键盘交互,而且一切都表现得很慢。
你知道更好的替代方案吗?从一系列字符串中突出显示android中textedit中的几个单词?

2 个答案:

答案 0 :(得分:0)

仅将setText和setselection发布到ui线程。不与ui元素直接交互的所有内容都应该在另一个线程上完成

答案 1 :(得分:0)

您的算法当然可以进行优化 - 稍后会在帖子中看到我的示例。但更重要的是,正如另一张海报所说,最好将工作卸载到另一个线程,然后只发布重要的东西。一个常见的模仿是,通过在处理程序中发布,您在另一个线程中运行,但事实并非如此。在另一个线程中进行处理并仅回发操作UI的部分:(包括一些算法更改,如果不清楚或我完全搞砸了,请告诉我:))

private void startWork() {
  new Thread(doWork).start();
}

Runnable doWork = new Runnable() {
  while (true) { // alter this condition to meet your needs
    for(int j=0;j<darkBlue.length;j++){
      String subText = mac.getText().toString();
      int length = darkBlue[j].length();
      int sub = subText.indexOf(darkBlue[j]);
      int index = 0;
      while(sub > 0){)
       index += (sub + length);
       colorSpan(Color.Blue, (index - length), index);
       allText = allText.substring(sub + length);
       sub = subText.indexOf(darkBlue[j]);
      }
    }
    try {
      Thread.sleep(1000);
    }
    catch (InterruptedException e) {
    }
  }
}

private void colorSpan(Color color, final int start, final int stop) {
  handler.post(new Runnable() {
    public void run() {
      String allText = mac.getText().toString();
      Spannable WordtoSpan = new SpannableString(allText);        
      WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), start, stop, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      mac.setText(WordtoSpan);
      mac.setSelection(mac.getText().length());
    }
  });
}

注意:我这样做有点匆忙,请原谅我是否有任何明显的错误