Android: как объединить Spannable.setSpan с String.format? - PullRequest
8 голосов
/ 26 августа 2011

Я устанавливаю Span для части текста.Сам Span работает хорошо.Однако текст создается String.format из Resources, и я не знаю start и end части в тексте, я собираюсь установить Span на.

Я пытался использовать пользовательскийHTML-теги в strings.xml, но getText или getString удаляют их.Я мог бы использовать что-то вроде getString(R.string.text, "<nb>" + arg + "</nb>"), затем Html.fromHtml(), потому что arg именно там, где я хочу установить Span.

Я видел этот подход , который использовал форматированный текст"normal text ##span here## normal text".Он анализирует строку, удаляет теги и устанавливает Span.

Мой вопрос: есть ли лучший способ выполнить настройку Span в форматированную строку, например "something %s something", или я должен использовать один из вышеуказанных подходов?

Ответы [ 3 ]

3 голосов
/ 30 ноября 2014

getText() вернет SpannedString объектов, которые содержат форматирование, определенное в strings.xml.Я создал пользовательскую версию String.format, которая будет сохранять любые промежутки в строке формата, даже если они содержат спецификаторы формата (промежутки в SpannedString аргументах также сохраняются).Используйте это так:

Spanned toDisplay = SpanFormatter.format(getText(R.string.foo), bar, baz, quux);
2 голосов
/ 05 сентября 2011

Я решил это, введя класс TaggedArg, экземпляры этого класса расширяются до <tag>value</tag>. Затем я создал объект, который отвечает за чтение текста, содержащего теги, и заменяет эти теги интервалами. Различные теги зарегистрированы в теге карты-> factory.

Был один маленький сюрприз. Если у вас есть текст вроде "<xx>something</xx> something", Html.fromHtml читает этот текст как "<xx>something something</xx>". Мне пришлось добавить теги <html> вокруг всего текста, чтобы предотвратить это.

0 голосов
/ 13 апреля 2016

Путь к getText(), который предположил Джордж, интересен.Но нет необходимости писать дополнительный класс.getText() возвращает CharSequence.Поэтому используйте SpannableStringBuilder, чтобы установить это в TextView:

textViewCell.setText(new SpannableStringBuilder(getText(R.string.foo));

В вашем strings.xml вы можете написать его с помощью html-тегов (не забывайте цитаты до и после текста):

<string name="foo">"CO<sub><small>2</small></sub>"</string>

Этот тип тегов работал для меня, либо устанавливая его вручную в textView (как выше), либо назначая его в макете.

...