2012-04-11 6 views
1

私はedittextの名前を強調したい
だから、私はそれらの言葉で文字列配列を持っています。毎秒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); 

問題は次のとおりです。
私はそれが言葉アレイで発見された場合のEditTextで書かれた単語をハイライトし、この次のコードを作成しましたキーボードは、すべてゆっくりと動作しています。
文字列の配列からアンドロイドのテキストエディットでいくつかの単語を強調表示するためのより良い選択肢はありますか?

答えて

0

setTextとsetselectionをuiスレッドにのみポストします。 ui要素と直接対話しないものは、別のスレッドで処理する必要があります。

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

NOTE(いくつかのアルゴリズムの変更が含まれ、そのはっきりしないか、私は完全に:)めちゃくちゃがあれば私に知らせて)お急ぎのときに少しでも嬉しいことがあれば教えてください

+0

私は試してもうまくいかなかった。 – funerr

+0

@ agam360何が壊れましたか? – JRaymond

関連する問題