ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку
logo

Форматирование текста в Android: strings.xml, HTML, Spannable

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы выделить текст жирным в strings.xml, используйте тег <b>:

xml
Скопировать код
<string name="bold_text">Вот так выглядит <b>жирный</b> текст.</string>

Теперь, чтобы отобразить этот текст в коде на Java, воспользуйтесь методом Html.fromHtml():

Java
Скопировать код
textView.setText(Html.fromHtml(getString(R.string.bold_text), Html.FROM_HTML_MODE_COMPACT));

Для Android-версий до API 24 должен использоваться краткий вариант:

Java
Скопировать код
textView.setText(Html.fromHtml(getString(R.string.bold_text)));

После этих шагов ваш текст будет отображаться жирным на всех версиях Android. 🌍

Создаем красивые тексты: управляем текстом в Android

Продвинутые приемы работы с текстом: Spannable строки

Для работы с динамическим текстом используйте SpannableString и SpannableStringBuilder:

Java
Скопировать код
SpannableStringBuilder spannableBuilder = new SpannableStringBuilder("Обычный жирный курсив");
spannableBuilder.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 8, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableBuilder.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 13, 19, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableBuilder);

Объединение статических и динамических элементов: шаблоны в действии

При работе с динамическими данными используйте шаблоны %1$s:

xml
Скопировать код
<string name="welcome_message">Добро пожаловать в <b>%1$s</b> мир!</string>

В коде на Java или Kotlin замените шаблоны динамическими данными:

Java
Скопировать код
String userName = "Гламурный";
String welcomeText = String.format(getString(R.string.welcome_message), userName);

Spanned formattedText = Html.fromHtml(welcomeText, Html.FROM_HTML_MODE_COMPACT);
textView.setText(formattedText);

Экранирование HTML-тегов: мастерство форматирования

При использовании в строках HTML-тегов, не забывайте про экранирование:

xml
Скопировать код
<string name="example">Этот тег безобиден: &lt;b&gt;ЗДЕСЬ НЕТ HTML&lt;/b&gt;</string>

Kotlin: Почему бы и не получить удовольствие?

Kotlin и Android – идеальная пара

Для работы на Kotlin создайте расширение функции для преобразования:

kotlin
Скопировать код
fun String.fromHtmlCompat(): Spanned =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(this, Html.FROM_HTML_MODE_COMPACT)
    } else {
        Html.fromHtml(this)
    }

textView.text = getString(R.string.bold_text).fromHtmlCompat()

Безопасность прежде всего: TextUtils.htmlEncode

Используйте TextUtils.htmlEncode для обработки специальных символов:

Java
Скопировать код
String safeString = TextUtils.htmlEncode(userInput);

Визуализация

Представьте жирное выделение текста в strings.xml как стильное новое платье:

Markdown
Скопировать код
<resources>
    <string name="bold_phrase">Каждый день – отличный повод для <b>нового платья</b>!</string>
</resources>

Как это выглядит:

До: 👗 Каждый день – отличный повод для нового платья!
После: 👗 Каждый день – отличный повод для **нового платья**!

Так, жирное выделение слов обращает на себя внимание, делая ваш текст еще более узнаваемым!

Совместимость: секрет устойчивых отношений

Когда у SDK свои прихоти

Проверяйте Build.VERSION.SDK_INT, словно это срок годности продуктов:

Java
Скопировать код
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml(getString(R.string.bold_text), Html.FROM_HTML_MODE_COMPACT));
} else {
    textView.setText(Html.fromHtml(getString(R.string.bold_text)));
}

getText() против getString(): кто же победит?

Используйте getText(), чтобы обработать стилизованные ресурсы:

Java
Скопировать код
CharSequence styledText = getText(R.string.bold_text);
textView.setText(styledText);

HTML внутри CDATA: потому что каждому нужно безопасное место

Используйте секции CDATA для более аккуратного форматирования HTML:

xml
Скопировать код
<string name="rich_text"><![CDATA[Это <b>необычный</b> подход!]]></string>

Полезные материалы

  1. android – как выделить определенный текст в TextView ЖИРНЫМ – Stack Overflow
  2. Ресурсы строк | Android Developers
  3. SpannableString | Android Developers
  4. Spans | Android Developers
  5. Стилизация интернационализированного текста в Android | Florina Muntenescu | Android Developers | Medium
  6. Возможно ли применить несколько стилей внутри TextView? – Stack Overflow
  7. TextView | Android Developers