Форматирование текста в Android: strings.xml, HTML, Spannable
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы выделить текст жирным в strings.xml
, используйте тег <b>
:
<string name="bold_text">Вот так выглядит <b>жирный</b> текст.</string>
Теперь, чтобы отобразить этот текст в коде на Java, воспользуйтесь методом Html.fromHtml()
:
textView.setText(Html.fromHtml(getString(R.string.bold_text), Html.FROM_HTML_MODE_COMPACT));
Для Android-версий до API 24 должен использоваться краткий вариант:
textView.setText(Html.fromHtml(getString(R.string.bold_text)));
После этих шагов ваш текст будет отображаться жирным на всех версиях Android. 🌍
Создаем красивые тексты: управляем текстом в Android
Продвинутые приемы работы с текстом: Spannable строки
Для работы с динамическим текстом используйте SpannableString
и SpannableStringBuilder
:
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
:
<string name="welcome_message">Добро пожаловать в <b>%1$s</b> мир!</string>
В коде на Java или Kotlin замените шаблоны динамическими данными:
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-тегов, не забывайте про экранирование:
<string name="example">Этот тег безобиден: <b>ЗДЕСЬ НЕТ HTML</b></string>
Kotlin: Почему бы и не получить удовольствие?
Kotlin и Android – идеальная пара
Для работы на 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
для обработки специальных символов:
String safeString = TextUtils.htmlEncode(userInput);
Визуализация
Представьте жирное выделение текста в strings.xml
как стильное новое платье:
<resources>
<string name="bold_phrase">Каждый день – отличный повод для <b>нового платья</b>!</string>
</resources>
Как это выглядит:
До: 👗 Каждый день – отличный повод для нового платья!
После: 👗 Каждый день – отличный повод для **нового платья**!
Так, жирное выделение слов обращает на себя внимание, делая ваш текст еще более узнаваемым!
Совместимость: секрет устойчивых отношений
Когда у SDK свои прихоти
Проверяйте Build.VERSION.SDK_INT
, словно это срок годности продуктов:
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()
, чтобы обработать стилизованные ресурсы:
CharSequence styledText = getText(R.string.bold_text);
textView.setText(styledText);
HTML внутри CDATA: потому что каждому нужно безопасное место
Используйте секции CDATA для более аккуратного форматирования HTML:
<string name="rich_text"><![CDATA[Это <b>необычный</b> подход!]]></string>
Полезные материалы
- android – как выделить определенный текст в TextView ЖИРНЫМ – Stack Overflow
- Ресурсы строк | Android Developers
- SpannableString | Android Developers
- Spans | Android Developers
- Стилизация интернационализированного текста в Android | Florina Muntenescu | Android Developers | Medium
- Возможно ли применить несколько стилей внутри TextView? – Stack Overflow
- TextView | Android Developers