Jetpack Compose 및 스타일이 지정된 strings.xml

Nov 26 2022
문제 따라서 strings.xml에 HTML 콘텐츠가 포함된 항목이 있습니다. 모든 스타일이 사라졌습니다! 무슨 일이에요? 솔루션 Jetpack Compose는 아직 스타일이 지정된 텍스트를 지원하지 않습니다.
Jetpack Compose 로고. 멋져 보이지만 스타일이 지정된 텍스트가 없습니다. 왜 그런 겁니까?

문제

따라서 HTML 콘텐츠가 포함된 strings.xml 항목이 있습니다.

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

텍스트 미리보기. 스타일링이 빠졌어요!

모든 스타일링이 끝났습니다! 무슨 일이에요?

해결책

Jetpack Compose는 아직 스타일이 지정된 텍스트를 지원하지 않습니다. 그러나 고치는 것은 간단합니다.

139320238 문제 에 이어 자체 문자열 리소스 로더를 만듭니다.

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

텍스트 미리보기. 미리보기에서 지원되지 않기 때문에 여전히 스타일 지정이 없습니다.

에 뭐... 아직 스타일이 지정되지 않았나요? 문제는 미리보기 모드도 스타일이 지정된 텍스트를 지원하지 않는다는 것입니다.

그러나 실제 장치는 다음을 수행합니다.

장치에서 텍스트 미리보기. 스타일링이 있습니다!

그리고 우리 사용자는 실제 장치만 사용하기 때문에 우리는 모두 괜찮습니다.

후드

Jetpack Compose Text 구성요소는 스타일이 지정된 텍스트를 지원합니다. 지원을 AnnotatedString이라고 합니다. 따라서 우리가 AnnotatedStrings와 함께 Text를 제공할 수 있다면 우리는 모두 괜찮습니다.

Android 측에서는 현지화된 문자열을 가져오는 두 가지 방법을 제공합니다.

  • String을 반환하는 String getString(id). 스타일을 포함할 수 없으며 HTML 태그는 삭제되고 무시됩니다.
  • CharSequence를 반환하는 CharSequence getText(id). 이 시퀀스에는 HTML에 정의된 스타일 범위도 포함되어 있습니다.