คำที่เป็นตัวหนาในสตริง strings.xml ใน Android


117

ฉันมีข้อความยาวในหนึ่งในสตริงที่ strings.xml ฉันต้องการทำตัวหนาและเปลี่ยนสีของคำบางคำในข้อความนั้น

ฉันจะทำมันได้อย่างไร?


คุณสามารถเจาะจงมากขึ้นในแง่ของสิ่งที่คุณพยายามบรรลุโดยรวมได้หรือไม่?
Brian

คำตอบ:


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 ค่อนข้างคลุมเครือเกินไปสำหรับเรื่องนี้: หากคุณใช้แท็กเช่น <b> ในทรัพยากรสตริงของคุณให้ตรวจสอบว่าคุณได้รับข้อมูลโดยใช้getText(R.string.whatever)มากกว่าgetString(R.string.whatever)
andygeers

1
มันไม่ควรจะเป็นnameแทนid?
Hendra Anggrian

4
ดังนั้นจำเป็นที่จะต้องไม่มีหรือHtml.fromHtml Spannableเพียงใช้getText(R.string.whatever)เช่นเดียวกับที่ @andygeers กล่าวถึง
Alaa M.

1
@andygeers เราจะทำอย่างไรกับสตริงเช่น "My name is <b>% s </b>" ซึ่งไม่สามารถใช้ getText ได้เนื่องจากยอมรับเพียงพารามิเตอร์เดียว
Taylor

46

ใช้แท็ก 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 ขอขอบคุณพี่ชาย.
Sup.Ia

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 ไม่ใช่ Spannable
Tigran Babajanyan

1
จะเกิดอะไรขึ้นถ้าสตริงของคุณเป็นปริมาณที่คุณต้องเพิ่มตัวเลข?
Taylor

getText ไม่อนุญาตให้คุณใช้ตัวยึดตำแหน่ง
Vincent_Paing

11

ใน 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

3

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 $ s" แทน "{1}" และเรียก getString (R.string.message, "5.21") โดยไม่แทนที่ ()
Adrian Grygutis

เอกสารสนับสนุนคำตอบนี้: developer.android.com/guide/topics/resources/…แม้ว่าจะต้องส่งผ่านโปรแกรมแยกวิเคราะห์ HTML
ก็ตาม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.