1

編集テキストで名前を強調表示したいので、
それらの単語を含む文字列配列があります。
私は次のコードを作成しました。これは、編集テキストに書かれた単語が単語配列で見つかった場合にそれを強調表示します。

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のテキスト編集でいくつかの単語を強調表示するためのより良い代替手段を知っていますか?

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 に答える