2012-01-09 12 views
7

Ho i seguenti dati di input in String: "Hello # this # is # sample # text."Elimina caratteri da CharSequence espandibile

Imposta il colore di sfondo per tutti gli elementi tra # caratteri. Ecco quello che ho ottenuto finora:

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

impostazione dello sfondo opere di colori, ma hanno uno stile troppo caratteri segnaposto #. Come rimuoverli prima di restituire il risultato, perché il metodo ReplaceAll non esiste per CharSequence?

Io uso questa funzione per disegnare le righe di TextView in ListView. Si sente un po 'più lento nell'emulatore dopo aver aggiunto questa funzione di styling. Forse dovrei avvicinarmi in qualche altro modo, ad es. utilizzare un TextView personalizzato con la funzione di disegno personalizzato?

risposta

12

Sembrava una cosa divertente da provare.

La chiave era SpannableStringBuilder. Con SpannableString il testo stesso è immutabile, ma con SpannableStringBuilder sia il testo che il markup possono essere modificati. Con questo in mente ho modificato il tuo frammento di un po 'per fare quello che vuoi:

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

non ho molta esperienza con Spannables in generale, e non so se il modo in cui sono andato sull'eliminazione il "#" è il metodo migliore, ma sembra funzionare.

+0

Grazie per il vostro tempo, Spannables è un po 'di confusione con cui lavorare all'inizio. Almeno funziona più velocemente di fromHtml. – joshas

0

Come rimuoverli prima di restituire il risultato, perché il metodo ReplaceAll non esiste per CharSequence?

Si potrebbe prendere l'approccio di Html.fromHtml() - costruire l'SpannedString, non provare a modificare in posizione.