जेटपैक कंपोज और स्टाइल स्ट्रिंग्स.एक्सएमएल

Nov 26 2022
समस्या तो आपके पास HTML सामग्री के साथ string.xml में एक प्रविष्टि है: सभी स्टाइल चली गई है! क्या हुआ? समाधान जेटपैक कंपोज़ अभी तक शैलीबद्ध पाठ का समर्थन नहीं करता है।
जेटपैक कंपोज़ लोगो। यह अच्छा दिखता है, लेकिन इसमें स्टाइल वाला टेक्स्ट नहीं है। ऐसा क्यों?

संकट

तो आपके पास 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 में परिभाषित स्टाइल स्पैन भी शामिल हैं।