Jetpack Strings.xml oluşturun ve stil verin

Nov 26 2022
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.
Jetpack Oluşturma logosu. Güzel görünüyor, ancak stilize edilmiş metni yok. Nedenmiş?

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

Metnin önizlemesi. Stil eksik!

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

Metnin önizlemesi. Önizlemede desteklenmediği için hala stil yok

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:

Metnin bir cihazda önizlemesi. Stil var!

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.