Androidのstrings.xmlの文字列内の太字の単語


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の公式ドキュメントが少し曖昧すぎることにgetText(R.string.whatever)getString(R.string.whatever)
気付いた人

1
name代わりになるはずではないidですか?
ヘンドラアングリアン2016

4
Html.fromHtmlまたはの必要はありませんSpannablegetText(R.string.whatever)前述の@andygeersのように使用します。
Alaa M. 2016

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を使用する人々にとって完全に機能します。ありがとう、兄弟。
2019年

44

David Olssonが言ったように、文字列リソースで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を返し、スパナブルではない
Tigran Babajanyan '31 / 10/31

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

さらに多くの拡張機能を編集

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}"の代わりに "%1 $ s"を配置し、replace()なしでgetString(R.string.message、 "5.21")を呼び出します
Adrian Grygutis

ドキュメントはこの回答をサポートしています:developer.android.com/guide/topics/resources/…
ただし
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.