Жирные слова в строке strings.xml в Android

115

У меня длинный текст в одной из строк в strings.xml. Я хочу выделить жирным шрифтом и изменить цвет некоторых слов в этом тексте.

Как мне это сделать?

Каролина
источник
Не могли бы вы быть более конкретными в отношении того, чего вы пытаетесь достичь в целом?
Брайан

Ответы:

192

В основном вы можете использовать теги html в своем строковом ресурсе, например:

<resource>
    <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

И используйте Html.fromHtml или используйте spannable, проверьте ссылку, которую я опубликовал.

Старый аналогичный вопрос: возможно ли иметь несколько стилей внутри TextView?

Дэвид Олссон
источник
16
Кроме того, в зависимости от того, как вы используете строку ресурса, вам может потребоваться поместить теги полужирным / курсивным шрифтом в блок CDATA, чтобы они не анализировались до тех пор, пока не будут использованы Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
dule
133
Для всех, кто нашел официальную документацию Android слишком расплывчатой ​​по этому поводу: если вы используете теги, такие как <b> в своем строковом ресурсе, убедитесь, что вы getText(R.string.whatever)getString(R.string.whatever)
получили
1
это не должно быть nameвместо id?
Хендра Анггриан,
4
Так что нет необходимости в Html.fromHtmlили Spannable. Просто используйте, getText(R.string.whatever)как упомянуто @andygeers.
Alaa M.
1
@andygeers Что мы можем сделать для такой строки, как «Меня зовут <b>% s </b>», в которой нельзя использовать getText, поскольку она принимает только один параметр?
Тейлор
45

Используйте тег html внутри строковых ресурсов: -

<resources>
<string name="string_resource_name"><![CDATA[<b> Your text </b>]]> </string>
</resources>

И получите жирный текст из строковых ресурсов, например: -

private Spanned getSpannedText(String text) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT);
        } else {
            return Html.fromHtml(text);
        }
    }


 String s = format(context.getResources().getString(R.string.string_resource_name));
 textView.setText(getSpannedText(s));
Сагар Чорадж
источник
это лучший ответ, и он полностью работает для людей, которые используют @BindingAdapter. Спасибо брат.
Sup.Ia
44

Как сказал Дэвид Олссон, вы можете использовать HTML в своих строковых ресурсах:

<resource>
    <string name="my_string">A string with <i>actual</i> <b>formatting</b>!</string>
</resources>

Затем, если вы используете, getText(R.string.my_string)а не getString(R.string.my_string)возвращаетесь, CharSequenceа не, Stringкоторый содержит встроенное форматирование.

andygeers
источник
getText возвращает CharSequence not a Spannable
Тигран Бабаджанян
1
Что, если ваша строка - это количество, к которому вам нужно добавить число?
Тейлор
getText не позволяет использовать заполнители
Vincent_Paing
11

В kotlin вы можете создавать функции расширений для ресурсов (действия | фрагменты | контекст), которые преобразуют вашу строку в диапазон html.

например

fun Resources.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Resources.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = getQuantityString(id, quantity).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

fun String.toHtmlSpan(): Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
    Html.fromHtml(this)
}

использование

//your strings.xml
<string name="greeting"><![CDATA[<b>Hello %s!</b><br>]]>This is newline</string>

//in your fragment or activity
resources.getHtmlSpannedString(R.string.greeting, "World")

ИЗМЕНИТЬ еще больше расширений

fun Context.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Context.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Activity.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Activity.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Fragment.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Fragment.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()
Свкака
источник
@Himanshu Mori какой-нибудь фрагмент поможет. Вы используете его в классе котлина?
svkaka
1
Расширения Activity не нужны, Activity - это сам контекст
Фаршад Тахмасби
2

Strings.xml

<string name="my_text"><Data><![CDATA[<b>Well Done !</b><br></br>All of your activities are completed.<br></br>You may now close the app.<br></br>See you again next time.]]></Data></string>

Установить

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));
кунал хедкар
источник
1

Вы можете сделать это из строки

 <resources xmlns:tools="http://schemas.android.com/tools">

 <string name="total_review"><b>Total Review: </b> </string>

 </resources>

и может получить к нему доступ из кода Java, например

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());
Павел
источник
1

strings.xml

<string name="sentence">This price is <b>%1$s</b> USD</string>

page.java

String successMessage = getString(R.string.message,"5.21");

Эта цена 5.21 USD

Самет ÖZTOPRAK
источник
1
Вы должны использовать собственные функции для передачи параметров. Просто поместите "% 1 $ s" вместо "{1}" и вызовите getString (R.string.message, "5.21") без replace ()
Адриан Григутис,
Документы поддерживают этот ответ: developer.android.com/guide/topics/resources/ ... Хотя его необходимо передать через анализатор HTML
ProjectDelta,