142 votes

Mots en gras dans une chaîne de strings.xml sous Android

J'ai un long texte dans l'une des chaînes de strings.xml. Je veux mettre en gras et changer la couleur de certains mots dans ce texte.

Comment puis-je le faire?

230voto

David Olsson Points 3861

Vous pouvez essentiellement utiliser des balises html dans votre ressource de chaîne comme :

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

Et utilisez Html.fromHtml ou utilisez spannable, vérifiez le lien que j'ai posté.

Ancienne question similaire : est-il possible d'avoir plusieurs styles dans un TextView ?

54voto

Sagar Chorage Points 1212

Utilisez la balise html dans les ressources de chaîne :-

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

Et obtenez du texte en gras à partir de ressources de chaîne telles que :-

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

47voto

andygeers Points 2882

Comme l'a dit David Olsson, vous pouvez utiliser du HTML dans vos ressources de chaîne :

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

Ensuite, si vous utilisez getText(R.string.my_string) plutôt que getString(R.string.my_string) vous obtenez un CharSequence plutôt qu'un String qui contient la mise en forme intégrée.

11voto

svkaka Points 497

Dans kotlin, vous pouvez créer des fonctions d'extension sur les ressources (activités|fragments |contexte) qui convertiront votre chaîne en un span html

par exemple

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

Usage

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

MODIFIER encore plus d'extensions

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

6voto

kunal khedkar Points 241

Chaînes.xml

 <string name="my_text"><Data><![CDATA[<b>Your text</b>]]></Data></string>

Mettre en place

 textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X