Сміливі слова в рядку strings.xml в Android


114

Я маю довгий текст в одній із рядків у 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.
Алаа М.

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. Спасибі, брат.
Суп.Іа

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який містить вбудоване форматування.


getText повертає CharSequence не змушений
Тигран Бабаджанян

1
Що робити, якщо ваш рядок - це кількість, до якої потрібно додати число?
Тейлор

getText не дозволяє використовувати заповнювачі
Vincent_Paing

10

У 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")

EDIT ще більше розширень

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 допоможе якийсь фрагмент. Ви використовуєте його в класі kotlin?
svkaka

1
Розширення активності не потрібні. Активність - це сам контекст
Farshad Tahmasbi,

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


1
Ви повинні використовувати нативну функціональність для передачі параметрів. Просто розмістіть "% 1 $ s" замість "{1}" і зателефонуйте getString (R.string.message, "5.21") без заміни ()
Адріан Григутіс

Документи підтримують цю відповідь: developer.android.com/guide/topics/resources/… Хоча це потрібно пройти через HTML-аналізатор
ProjectDelta
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.