Android'de strings.xml dizesinde kalın kelimeler


115

Strings.xml'deki dizelerden birinde uzun bir metin var. O metindeki bazı kelimelerin rengini değiştirmek ve kalın yapmak istiyorum.

Nasıl yapabilirim?


Genel olarak neyi başarmaya çalıştığınız konusunda biraz daha spesifik olabilir misiniz?
Brian

Yanıtlar:


192

Temel olarak dize kaynağınızda html etiketleri kullanabilirsiniz, örneğin:

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

Html.fromHtml kullanın veya spannable kullanın, yayınladığım bağlantıyı kontrol edin.

Eski benzer soru: Bir TextView içinde birden çok stile sahip olmak mümkün mü?


16
Ayrıca, kaynak dizenizi nasıl kullandığınıza bağlı olarak, kalın / italik etiketleri bir CDATA bloğuna koymanız gerekebilir, böylece bunlar kullanılıncaya kadar ayrıştırılmazlar Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
dule

133
Resmi Android belgelerini bu konuda biraz fazla belirsiz bulan herkes için: Dize kaynağınızda <b> gibi etiketler kullanıyorsanız, bunu getText(R.string.whatever)yerinegetString(R.string.whatever)
andygeers

1
nameyerine olması gerekmiyor idmu?
Hendra Anggrian

4
Yani Html.fromHtmlya da gerek yok Spannable. Sadece getText(R.string.whatever)@andygeers'ın bahsettiği gibi kullanın .
Alaa M.

1
@andygeers Yalnızca tek bir parametre kabul ettiği için getText'i kullanamayan "Adım <b>% s </b>" gibi bir dize için ne yapabiliriz?
Taylor

45

Dize kaynakları içinde html etiketi kullanın: -

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

Ve aşağıdaki gibi dize kaynaklarından kalın metinler alın: -

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

bu en iyi cevaptır ve @BindingAdapter kullanan kişiler için tamamen işe yarar. Teşekkürler kardeşim.
Sup

44

David Olsson'un dediği gibi, dize kaynaklarınızda HTML kullanabilirsiniz:

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

Daha sonra , gömülü biçimlendirmeyi içeren a yerine geri almak getText(R.string.my_string)yerine kullanırsanız .getString(R.string.my_string)CharSequenceString


getText, CharSequence not a Spannable döndürüyor
Tigran Babajanyan

1
Ya dizeniz bir sayı eklemeniz gereken bir nicelikse?
Taylor

getText yer tutucular kullanmanıza izin vermiyor
Vincent_Paing

11

Kotlin'de, dizginizi bir html aralığına dönüştürecek kaynaklarda (etkinlikler | parçalar | bağlam) uzantı işlevleri oluşturabilirsiniz.

Örneğin

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

kullanım

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

Daha fazla uzantıyı DÜZENLE

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 bazı pasajlar yardımcı olabilir. Kotlin sınıfında mı kullanıyorsunuz?
svkaka

1
Etkinlik uzantıları gerekli değildir, Etkinlik Bağlamın kendisidir
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>

Kurmak

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

1

Dizeden yapabilirsin

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

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

 </resources>

ve buna java kodundan erişebilirsiniz.

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

Bu fiyat 5.21 USD


1
Parametreleri geçirmek için yerel işlevselliği kullanmalısınız. "{1}" yerine "% 1 $ s" koyun ve getString'i (R.string.message, "5.21") değiştirmeden ()
çağırın

Dokümanlar bu yanıtı destekler: developer.android.com/guide/topics/resources/… Bir HTML ayrıştırıcısından geçirilmesi gerekmesine rağmen
ProjectDelta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.