2012-01-09 5 views
7

"Hello#this#is#sample#text"という文字列の入力データがあります。spannable CharSequenceから文字を削除

#文字の間にあるすべての要素の背景色を設定します。ここに私がこれまでに持っていたものがあります:

public static CharSequence colorBackground(CharSequence text) { 

    Pattern pattern = Pattern.compile("#(.*?)#"); 

    Spannable spannable = new SpannableString(text); 
    if(pattern != null) 
    { 
     Matcher matcher = pattern.matcher(text); 
     while(matcher.find()) 
     { 
      int start = matcher.start(); 
      int end = matcher.end(); 
      CharacterStyle span = new BackgroundColorSpan(0xFF404040); 
      spannable.setSpan(span, start, end, 0); 
     } 
    } 
    return spannable; 
} 

背景色は設定されていますが、プレースホルダー文字もスタイリングされています。 CharSequenceのReplaceAllメソッドが存在しないため、結果を返す前にそれらを削除する方法?

この関数を使用して、ListViewのTextView行をスタイル設定します。このスタイリング機能を追加した後は、エミュレータで少し遅く感じます。たぶん私は他の何かの方法でそれにアプローチするべきでしょうか?カスタム描画機能を備えたカスタムTextViewを使用しますか?

答えて

12

これはわかりやすいように聞こえました。

キーはSpannableStringBuilderでした。 SpannableStringでは、テキスト自体は不変ですが、SpannableStringBuilderを使用すると、テキストとマークアップの両方を変更できます。このことを念頭に置いて、私はあなたのスニペットは、あなたがやりたいことが少し修正:

public static CharSequence colorBackground(CharSequence text) { 

    Pattern pattern = Pattern.compile("#(.*?)#"); 

    SpannableStringBuilder ssb = new SpannableStringBuilder(text); 

    if(pattern != null) 
    { 
     Matcher matcher = pattern.matcher(text); 
     int matchesSoFar = 0; 
     while(matcher.find()) 
     { 
      int start = matcher.start() - (matchesSoFar * 2); 
      int end = matcher.end() - (matchesSoFar * 2); 
      CharacterStyle span = new BackgroundColorSpan(0xFF404040); 
      ssb.setSpan(span, start + 1, end - 1, 0); 
      ssb.delete(start, start + 1); 
      ssb.delete(end - 2, end -1); 
      matchesSoFar++; 
     } 
    } 
    return ssb; 
} 

私は一般的にSpannablesで多くの経験を持っていない、との方法は、私が削除について行ってきた場合、私は知りません"#"が最良の方法ですが、うまくいくようです。

+0

あなたのお時間をいただきありがとうございます。スパンターブルは、最初は少し混乱しています。少なくとも、fromHtmlよりも速く動作します。 – joshas

0

CharSequenceのReplaceAllメソッドが存在しないため、結果を返す前にそれらを削除する方法はありますか?

あなたはHtml.fromHtml()のアプローチを取ることができる - SpannedStringを構築し、所定の位置にそれを修正しようとしないでください。

関連する問題