Fettgedruckte Wörter in einer Zeichenfolge von strings.xml in Android


114

Ich habe einen langen Text in einer der Zeichenfolgen bei strings.xml. Ich möchte fett machen und die Farbe einiger Wörter in diesem Text ändern.

Wie kann ich es tun?


Können Sie etwas genauer sagen, was Sie insgesamt erreichen wollen?
Brian

Antworten:


192

Grundsätzlich können Sie HTML-Tags in Ihrer Zeichenfolgenressource verwenden, z.

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

Und verwenden Sie Html.fromHtml oder verwenden Sie spannable. Überprüfen Sie den Link, den ich gepostet habe.

Alte ähnliche Frage: Ist es möglich, mehrere Stile in einer Textansicht zu haben?


16
Abhängig davon, wie Sie Ihre Ressourcenzeichenfolge verwenden, müssen Sie möglicherweise die fett / kursiven Tags in einen CDATA-Block einfügen, damit sie erst analysiert werden, wenn sie verwendet werden von Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
dule

133
Für alle anderen, die die offizielle Android - Dokumentation etwas zu vage auf diese gefunden: Wenn Sie Tags wie <b> verwenden in Ihrem String - Ressource, stellen Sie sicher abrufen Sie es mit getText(R.string.whatever)nichtgetString(R.string.whatever)
andygeers

1
soll es nicht namestatt sein id?
Hendra Anggrian

4
Also keine Notwendigkeit für Html.fromHtmloder Spannable. Verwenden getText(R.string.whatever)Sie einfach wie @andygeers erwähnt.
Alaa M.

1
@andygeers Was können wir für eine Zeichenfolge wie "Mein Name ist <b>% s </ b>" tun, die getText nicht verwenden kann, da sie nur einen einzelnen Parameter akzeptiert?
Taylor

45

Verwenden Sie das HTML-Tag in den Zeichenfolgenressourcen: -

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

Und erhalten Sie fetten Text von Zeichenfolgenressourcen wie: -

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

Es ist die beste Antwort und funktioniert vollständig für die Benutzer von @BindingAdapter. Danke Bruder.
Sup.Ia

43

Wie David Olsson gesagt hat, können Sie HTML in Ihren Zeichenfolgenressourcen verwenden:

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

Wenn Sie dann getText(R.string.my_string)eher getString(R.string.my_string)eine verwenden CharSequenceals eine String, die die eingebettete Formatierung enthält, erhalten Sie diese zurück .


getText gibt CharSequence nicht ein Spannable zurück
Tigran Babajanyan

1
Was ist, wenn Ihre Zeichenfolge eine Menge ist, zu der Sie eine Zahl hinzufügen müssen?
Taylor

Mit getText können Sie keine Platzhalter verwenden
Vincent_Paing

10

In kotlin können Sie Erweiterungsfunktionen für Ressourcen (Aktivitäten | Fragmente | Kontext) erstellen, die Ihre Zeichenfolge in einen HTML-Bereich konvertieren

z.B

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

Verwendung

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

BEARBEITEN Sie noch mehr Erweiterungen

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 ein Ausschnitt würde helfen. Verwenden Sie es in der Kotlin-Klasse?
Svkaka

1
Aktivitätserweiterungen sind nicht erforderlich. Aktivität ist Kontext selbst
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>

Einstellen

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

1

Sie können es von Zeichenfolge tun

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

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

 </resources>

und kann über den Java-Code wie darauf zugreifen

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());

1

string.xml

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

page.java

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

Dieser Preis 5,21 USD


1
Sie sollten native Funktionen zum Übergeben von Parametern verwenden. Platzieren Sie einfach "% 1 $ s" anstelle von "{1}" und rufen Sie getString (R.string.message, "5.21") ohne replace () auf
Adrian Grygutis

Die Dokumente unterstützen diese Antwort: developer.android.com/guide/topics/resources/… Obwohl sie über einen HTML-Parser übergeben werden muss
ProjectDelta
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.