Kata tebal dalam string strings.xml di Android

115

Saya memiliki teks panjang di salah satu string di strings.xml. Saya ingin membuat tebal dan mengubah warna beberapa kata dalam teks itu.

Bagaimana saya bisa melakukannya?

Caroline
sumber
Bisakah Anda lebih spesifik dalam hal apa yang ingin Anda capai secara keseluruhan?
Brian

Jawaban:

192

Pada dasarnya Anda dapat menggunakan tag html dalam sumber daya string Anda seperti:

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

Dan gunakan Html.fromHtml atau gunakan spannable, periksa link yang saya posting.

Pertanyaan lama yang serupa: Apakah mungkin memiliki banyak gaya di dalam TextView?

David Olsson
sumber
16
Selain itu, tergantung bagaimana Anda menggunakan string sumber daya, Anda mungkin perlu meletakkan tag tebal / miring di blok CDATA sehingga tidak dapat diurai sampai digunakan oleh Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
dule
133
Bagi siapa pun yang merasa dokumentasi resmi Android agak terlalu kabur tentang ini: jika Anda menggunakan tag seperti <b> dalam sumber daya string Anda, pastikan Anda mengambilnya menggunakan getText(R.string.whatever)daripadagetString(R.string.whatever)
andygeers
1
bukankah itu seharusnya menjadi namegantinya id?
Hendra Anggrian
4
Jadi tidak perlu Html.fromHtmlatau Spannable. Gunakan saja getText(R.string.whatever)seperti yang disebutkan @andygeers.
Alaa M.
1
@andygeers Apa yang dapat kita lakukan untuk string seperti "Nama saya <b>% s </b>" yang tidak dapat menggunakan getText karena hanya menerima satu parameter?
Taylor
45

Gunakan tag html di dalam sumber daya string: -

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

Dan dapatkan teks tebal dari sumber string seperti: -

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));
Sagar Chorage
sumber
ini adalah jawaban terbaik dan berfungsi sepenuhnya untuk orang-orang yang menggunakan @BindingAdapter. Terima kasih saudara.
Sup. Ia
44

Seperti yang dikatakan David Olsson, Anda dapat menggunakan HTML di sumber daya string Anda:

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

Kemudian jika Anda menggunakan getText(R.string.my_string)daripada getString(R.string.my_string)Anda mendapatkan kembali CharSequencedaripada Stringyang berisi format yang disematkan.

andygeers
sumber
getText mengembalikan CharSequence bukan Spannable
Tigran Babajanyan
1
Bagaimana jika string Anda adalah kuantitas yang perlu Anda tambahkan angka?
Taylor
getText tidak mengizinkan Anda menggunakan placeholder
Vincent_Paing
11

Di kotlin, Anda dapat membuat fungsi ekstensi pada sumber daya (aktivitas | fragmen | konteks) yang akan mengonversi string Anda menjadi span html

misalnya

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

Pemakaian

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

EDIT lebih banyak ekstensi

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()
svkaka
sumber
@Himanshu Mori beberapa cuplikan akan membantu. Apakah Anda menggunakannya di kelas kotlin?
svkaka
1
Perluasan aktivitas tidak diperlukan, Aktivitas adalah Konteks itu sendiri
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>

Untuk mengatur

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));
kunal khedkar
sumber
1

Anda bisa melakukannya dari string

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

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

 </resources>

dan dapat mengaksesnya dari kode java seperti

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());
pavel
sumber
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");

Harga ini 5,21 USD

Samet ÖZTOPRAK
sumber
1
Anda harus menggunakan fungsionalitas asli untuk meneruskan parameter. Cukup tempatkan "% 1 $ s" alih-alih "{1}", dan panggil getString (R.string.message, "5.21") tanpa ganti ()
Adrian Grygutis
Dokumen mendukung jawaban ini: developer.android.com/guide/topics/resources/… Meskipun perlu diteruskan melalui pengurai HTML
ProjectDelta