Лучший способ получить SpannableString из SpannableStringBuilder

Я работаю в парсере, похожем на вики, который создает интервалы для набора токенов разметки. Он работает, но внутри итератора токенов мне часто приходится преобразовывать частичные результаты SpannableStringBuilder в SpannableString. Это вызывается довольно часто, поэтому я ищу наиболее эффективное решение для этого и избегаю создания дополнительных объектов.

На данный момент я использую;

SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);

Однако этот вызов valueOf внутренне создает тип SpannableString с нуля, выполняя toString и цикл для копирования назначенного spans.

Как следует из названия SpannableStringBuilder, я думаю, что, возможно, есть более быстрый способ получить SpannableString от строителя. Это правда?


person rupps    schedule 20.04.2014    source источник
comment
если у вас есть несколько интервалов в тексте, все, что вам нужно, это android.text.Spanned   -  person pskink    schedule 20.04.2014
comment
да теперь я понял, имя SpannableStringBuilder меня смутило, я привык работать с StringBuffer потом получая String в конце, и не понял, что SpannableStringBuilder также реализует Spanned, Charsequence и т.д... Конструктор пригодится для меня, потому что синтаксический анализатор выполняет множество операций над входящими строками, чтобы удалить разметку и создать множество различных диапазонов: URL, цвета, размеры, ... В основном я переписываю (ужасно) медленный Html.fromHtml   -  person rupps    schedule 20.04.2014
comment
отличная идея, я не знаю почему, но 95% товарищей здесь используют fromHtml, даже если ввод не html: они сначала создают искусственный html, а затем вызывают fromHtml, я не могу найти более глупой вещи   -  person pskink    schedule 20.04.2014
comment
да, и если вы посмотрите на исходный код Html.java, вы просто захотите умереть... он анализирует строку в XML SaxParser (!), а затем использует 100-килобайтную библиотеку Tagsoup с миллионами регулярных выражений, которые проверяют правильность формы, XML-схемы и еще много чего.... только для поддержки только полужирного шрифта, курсива, заголовков и цветов, что-то, что я сделал примерно со 150 строками и в 10 раз быстрее!   -  person rupps    schedule 20.04.2014


Ответы (1)


Нет необходимости преобразовывать SpannableStringBuilder в SpannableString, когда вы можете использовать его напрямую, как в TextView:

SpannableStringBuilder stuff = complex_routine_that_builds_it();
textView.setText(stuff);

Как уже было показано в вопросе, вы можете сделать преобразование, если вам абсолютно необходимо,

SpannableStringBuilder stuff = complex_routine_that_builds_it();
SpannableString result = SpannableString.valueOf(stuff);

но вы должны подумать, зачем вам вообще нужно делать это преобразование? Просто используйте оригинальный SpannableStringBuilder.

SpannableString и SpannableStringBuilder

Разница между этими двумя аналогична разнице между String и StringBuilder. String неизменяем, но вы можете изменить текст в StringBuilder.

Точно так же текст в SpannableString неизменяем, а текст в SpannableStringBuilder можно изменить. Однако важно отметить, что это относится только к тексту. Пролеты на обоих из них (даже SpannableString) могут быть изменены.

Связанные

person Suragch    schedule 10.04.2015