Ponadto, w zależności od tego, jak używasz ciągu zasobów, może być konieczne umieszczenie znaczników pogrubionych / kursywy w bloku CDATA, aby nie były analizowane, dopóki nie zostaną użyte przez Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
dule
133
Dla każdego, kto uznał oficjalną dokumentację Androida za zbyt niejasną na ten temat: jeśli używasz tagów takich jak <b> w swoim zasobie ciągu, upewnij się, że getText(R.string.whatever)getString(R.string.whatever)
pobierasz
1
nie powinno być namezamiast id?
Hendra Anggrian
4
Więc nie ma potrzeby Html.fromHtmllub Spannable. Po prostu użyj getText(R.string.whatever)jak wspomniano @andygeers.
Alaa M.
1
@andygeers Co możemy zrobić dla łańcucha takiego jak „Nazywam się <b>% s </b>”, który nie może używać funkcji getText, ponieważ akceptuje tylko jeden parametr?
Taylor
45
Użyj tagu html wewnątrz zasobów ciągu: -
<resources><stringname="string_resource_name"><![CDATA[<b> Your text </b>]]> </string></resources>
I uzyskaj pogrubiony tekst z zasobów ciągów, takich jak: -
privateSpanned getSpannedText(String text){if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.N){returnHtml.fromHtml(text,Html.FROM_HTML_MODE_COMPACT);}else{returnHtml.fromHtml(text);}}String s = format(context.getResources().getString(R.string.string_resource_name));
textView.setText(getSpannedText(s));
to najlepsza odpowiedź i całkowicie działa dla osób używających @BindingAdapter. Dziękuję, bracie.
Sup
44
Jak powiedział David Olsson, możesz używać HTML w swoich zasobach ciągów:
<resource><stringname="my_string">A string with <i>actual</i><b>formatting</b>!</string></resources>
Następnie, jeśli używasz getText(R.string.my_string)zamiast getString(R.string.my_string)a CharSequencezamiast a, Stringktóry zawiera osadzone formatowanie.
A co jeśli twój ciąg to ilość, do której musisz dodać liczbę?
Taylor
getText nie pozwala na używanie symboli zastępczych
Vincent_Paing
11
W kotlin możesz tworzyć funkcje rozszerzeń na zasobach (działania | fragmenty | kontekst), które konwertują twój ciąg na zakres html
na przykład
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)}
Stosowanie
//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")
EDYTUJ jeszcze więcej rozszerzeń
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 trochę fragmentu może pomóc. Czy używasz go w klasie kotlin?
svkaka
1
Rozszerzenia aktywności nie są konieczne, aktywność jest kontekstem sama w sobie
Farshad Tahmasbi
2
Strings.xml
<stringname="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>
Do przekazywania parametrów należy używać natywnych funkcji. Po prostu umieść „% 1 $ s” zamiast „{1}” i wywołaj getString (R.string.message, „5.21”) bez zamiany ()
Odpowiedzi:
Zasadniczo możesz użyć tagów HTML w swoim zasobie ciągu, takich jak:
I użyj Html.fromHtml lub użyj spannable, sprawdź link, który opublikowałem.
Stare podobne pytanie: czy można mieć wiele stylów wewnątrz TextView?
źródło
Html.fromHtml()
: ...<![CDATA[<b><i>so</i></b>]]>
...getText(R.string.whatever)
getString(R.string.whatever)
name
zamiastid
?Html.fromHtml
lubSpannable
. Po prostu użyjgetText(R.string.whatever)
jak wspomniano @andygeers.Użyj tagu html wewnątrz zasobów ciągu: -
I uzyskaj pogrubiony tekst z zasobów ciągów, takich jak: -
źródło
Jak powiedział David Olsson, możesz używać HTML w swoich zasobach ciągów:
Następnie, jeśli używasz
getText(R.string.my_string)
zamiastgetString(R.string.my_string)
aCharSequence
zamiast a,String
który zawiera osadzone formatowanie.źródło
W kotlin możesz tworzyć funkcje rozszerzeń na zasobach (działania | fragmenty | kontekst), które konwertują twój ciąg na zakres html
na przykład
Stosowanie
EDYTUJ jeszcze więcej rozszerzeń
źródło
Strings.xml
Ustawić
źródło
Możesz to zrobić ze sznurka
i można uzyskać do niego dostęp z kodu Java, takiego jak
źródło
strings.xml
page.java
Cena ta 5,21 USD
źródło