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ć?


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?


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

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.


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

@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)));

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());

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.