जेटपैक कंपोज और स्टाइल स्ट्रिंग्स.एक्सएमएल
संकट
तो आपके पास HTML सामग्री के साथ string.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))
}
सारी स्टाइल चली गई है! क्या हुआ?
समाधान
जेटपैक कंपोज़ अभी तक स्टाइल वाले टेक्स्ट का समर्थन नहीं करता है। लेकिन इसे ठीक करना आसान है।
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))
}
एह क्या... अभी भी स्टाइल नहीं है? बात यह है कि, पूर्वावलोकन मोड स्टाइल किए गए टेक्स्ट का भी समर्थन नहीं करता है।
लेकिन, एक वास्तविक उपकरण करता है:
और क्योंकि हमारे उपयोगकर्ता केवल वास्तविक उपकरणों का उपयोग करते हैं, हम सब ठीक हैं।
हुड के नीचे
जेटपैक कंपोज़ टेक्स्ट घटक स्टाइल टेक्स्ट का समर्थन करता है। समर्थन को एनोटेटेड स्ट्रिंग कहा जाता है। तो अगर हम एनोटेट स्ट्रिंग्स के साथ टेक्स्ट प्रदान कर सकते हैं, तो हम सब ठीक हैं।
Android की ओर से, यह स्थानीयकृत स्ट्रिंग प्राप्त करने के दो तरीके प्रदान करता है:
- स्ट्रिंग गेटस्ट्रिंग (आईडी), जो एक स्ट्रिंग देता है। इसमें कोई स्टाइल नहीं हो सकता है और एचटीएमएल टैग को छोड़ दिया गया है और अनदेखा किया गया है।
- CharSequence getText(id), जो एक CharSequence लौटाता है। कैच यह है कि इस क्रम में HTML में परिभाषित स्टाइल स्पैन भी शामिल हैं।