Jetpack Strings.xml oluşturun ve stil verin
Sorun Strings.xml'de HTML içeriği olan bir girişiniz var: Tüm stiller gitti! Ne oldu? Çözüm Jetpack Compose henüz stil verilmiş metni desteklemiyor.
Sorun
Yani strings.xml'de HTML içeriği olan bir girişiniz var:
<string name="neatly_styled">Nice <u>underlined</u> and <b>bold</b> text.</string>
@Preview
@Compose
fun PreviewStyledText() {
Text(text = stringResource(R.string.neatly_styled))
}
Tüm stil gitti! Ne oldu?
Çözüm
Jetpack Compose henüz stil verilmiş metni desteklemiyor. Ama düzeltmesi basit.
139320238 numaralı sayının ardından , kendi dize kaynak yükleyicimizi oluşturuyoruz:
@Composable
fun annotatedStringResource(@StringRes id: Int): AnnotatedString {
val resources = LocalContext.current.resources
return remember(id) {
val text = resources.getText(id)
if (text is Spanned) {
val spanStyles = mutableListOf<AnnotatedString.Range<SpanStyle>>()
spanStyles.addAll(text.getSpans(0, text.length, UnderlineSpan::class.java).map {
AnnotatedString.Range(
SpanStyle(textDecoration = TextDecoration.Underline),
text.getSpanStart(it),
text.getSpanEnd(it)
)
})
spanStyles.addAll(text.getSpans(0, text.length, StyleSpan::class.java).map {
AnnotatedString.Range(
SpanStyle(fontWeight = FontWeight.Bold),
text.getSpanStart(it),
text.getSpanEnd(it)
)
})
AnnotatedString(text.toString(), spanStyles = spanStyles)
} else {
AnnotatedString(text.toString())
}
}
}
@Preview
@Composable
fun PreviewStyledTextFix() {
Text(text = annotatedStringResource(R.string.styled_text))
}
Eh ne… Hâlâ TARZ DEĞİL MİSİNİZ? Mesele şu ki, Önizleme modu da stillendirilmiş metni desteklemiyor.
Ancak, gerçek bir cihaz şunları yapar:
Ve kullanıcılarımız yalnızca gerçek cihazlar kullandıkları için hepimiz iyiyiz.
kaputun altında
Jetpack Compose Text bileşeni, stil verilmiş metni destekler. Desteğin adı AnnotatedString'dir. Dolayısıyla, AnnotatedStrings ile Metin sağlayabilirsek, hepimiz iyiyiz.
Android tarafında, yerelleştirilmiş bir dize elde etmenin iki yolunu sunar:
- Bir String döndüren String getString(id). Bu, herhangi bir stil içeremez ve HTML etiketleri basitçe bırakılır ve yoksayılır.
- Bir CharSequence döndüren CharSequence getText(id). İşin püf noktası, bu dizinin HTML'de tanımlanan stil aralıklarını da içermesidir.
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'