2012-01-09 3 views
7

У меня есть следующие входные данные в String: «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; 
} 

Настройка цвета фона, но символы-заполнители # тоже стилизованы. Как удалить их перед возвратом результата, потому что метод ReplaceAll не существует для CharSequence?

Я использую эту функцию для создания строк TextView в ListView. После добавления этой функции стиля она немного медленнее в эмуляторе. Может быть, я должен подойти к нему каким-то другим способом, например. использовать пользовательский 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 немного запутывают работу с самого начала. По крайней мере, он работает быстрее, чем fromHtml. – joshas

0

Как удалить их перед возвратом результата, потому что метод ReplaceAll не существует для CharSequence?

Вы могли бы принять подход Html.fromHtml() - построить SpannedString, не пытайтесь изменить его на месте.

Смежные вопросы