1

我想在编辑文本中突出显示名称,
所以我有一个包含这些单词的字符串数组。
我创建了以下代码,如果在单词数组中找到它,则突出显示在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 中的几个单词?

4

2 回答 2

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());
    }
  });
}

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

于 2012-04-12T01:07:53.333 回答
0

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

于 2012-04-11T23:43:15.353 回答