2012-01-09 44 views
7

我在字符串中輸入以下數據:「Hello#this#is#sample#text。」從可擴展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

感謝您的時間,Spannables在啓動時有點混亂。至少它比HTML工作得更快。 – joshas 2012-01-10 19:20:54

0

如何在返回結果之前刪除它們,因爲CharSequence中不存在方法ReplaceAll?

你可以採取Html.fromHtml()的方法 - 建立SpannedString,不要嘗試修改它到位。