Pogrubione słowa w ciągu znaków strings.xml w systemie Android

115

Mam długi tekst w jednym z ciągów w strings.xml. Chcę pogrubić i zmienić kolor niektórych słów w tym tekście.

Jak mogę to zrobić?

Karolina
źródło
Czy możesz być bardziej szczegółowy, jeśli chodzi o to, co ogólnie próbujesz osiągnąć?
Brian

Odpowiedzi:

192

Zasadniczo możesz użyć tagów HTML w swoim zasobie ciągu, takich jak:

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

I użyj Html.fromHtml lub użyj spannable, sprawdź link, który opublikowałem.

Stare podobne pytanie: czy można mieć wiele stylów wewnątrz TextView?

David Olsson
źródło
16
Ponadto, w zależności od tego, jak używasz ciągu zasobów, może być konieczne umieszczenie znaczników pogrubionych / kursywy w bloku CDATA, aby nie były analizowane, dopóki nie zostaną użyte przez Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
dule
133
Dla każdego, kto uznał oficjalną dokumentację Androida za zbyt niejasną na ten temat: jeśli używasz tagów takich jak <b> w swoim zasobie ciągu, upewnij się, że getText(R.string.whatever)getString(R.string.whatever)
pobierasz
1
nie powinno być namezamiast id?
Hendra Anggrian
4
Więc nie ma potrzeby Html.fromHtmllub Spannable. Po prostu użyj getText(R.string.whatever)jak wspomniano @andygeers.
Alaa M.
1
@andygeers Co możemy zrobić dla łańcucha takiego jak „Nazywam się <b>% s </b>”, który nie może używać funkcji getText, ponieważ akceptuje tylko jeden parametr?
Taylor
45

Użyj tagu html wewnątrz zasobów ciągu: -

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

I uzyskaj pogrubiony tekst z zasobów ciągów, takich jak: -

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));
Sagar Chorage
źródło
to najlepsza odpowiedź i całkowicie działa dla osób używających @BindingAdapter. Dziękuję, bracie.
Sup
44

Jak powiedział David Olsson, możesz używać HTML w swoich zasobach ciągów:

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

Następnie, jeśli używasz getText(R.string.my_string)zamiast getString(R.string.my_string)a CharSequencezamiast a, Stringktóry zawiera osadzone formatowanie.

andygeers
źródło
getText zwraca CharSequence not a Spannable
Tigran Babajanyan
1
A co jeśli twój ciąg to ilość, do której musisz dodać liczbę?
Taylor
getText nie pozwala na używanie symboli zastępczych
Vincent_Paing
11

W kotlin możesz tworzyć funkcje rozszerzeń na zasobach (działania | fragmenty | kontekst), które konwertują twój ciąg na zakres html

na przykład

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)
}

Stosowanie

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

EDYTUJ jeszcze więcej rozszerzeń

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()
svkaka
źródło
@Himanshu Mori trochę fragmentu może pomóc. Czy używasz go w klasie kotlin?
svkaka
1
Rozszerzenia aktywności nie są konieczne, aktywność jest kontekstem sama w sobie
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>

Ustawić

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));
kunal khedkar
źródło
1

Możesz to zrobić ze sznurka

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

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

 </resources>

i można uzyskać do niego dostęp z kodu Java, takiego jak

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());
pavel
źródło
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");

Cena ta 5,21 USD

Samet ÖZTOPRAK
źródło
1
Do przekazywania parametrów należy używać natywnych funkcji. Po prostu umieść „% 1 $ s” zamiast „{1}” i wywołaj getString (R.string.message, „5.21”) bez zamiany ()
Adrian Grygutis
Dokumenty obsługują tę odpowiedź: developer.android.com/guide/topics/resources/ ... Chociaż musi to zostać przekazane przez parser HTML
ProjectDelta