안드로이드/개발관련(Kotlin)

텍스트를 클릭하여 이벤트를 실행하는 Text (Compose)

닉네임못짓는사람 2024. 7. 30. 20:57
반응형
@Composable
fun ClickableAnnotationText(
    text: String,
    fontSize: TextUnit = TextUnit.Unspecified,
    color: Color = Color.Unspecified,
    textAlign: TextAlign = TextAlign.Unspecified,
    locale: Locale = Locale.JAPAN,
    weight: FontWeight = FontWeight.Normal,
    clickable: List<Pair<String, () -> Unit>>,
    modifier: Modifier = Modifier
) {
    val annotationString = buildAnnotatedString {
        append(text)

        clickable.forEach {
            val start = text.indexOf(it.first)
            val end = start + it.first.length

            addStyle(
                style = SpanStyle(
                    color = colorResource(id = R.color.sapphire)
                ),
                start = start,
                end = end
            )
            addStringAnnotation(
                tag = it.first,
                annotation = "",
                start = start,
                end = end
            )
        }
    }

    ClickableText(
        text = annotationString,
        style = defaultTextStyle(
            color = color,
            fontSize = fontSize,
            locale = locale,
            weight = weight,
            textAlign = textAlign
        ),
        modifier = modifier
    ) { offset ->
        clickable.forEach { pair ->
            annotationString.getStringAnnotations(
                tag = pair.first,
                start = offset,
                end = offset
            ).firstOrNull()?.let {
                pair.second()
            }
        }
    }
}

 

텍스트 전문에서 일부 텍스트를 클릭하여 이벤트 실행

 

클릭할 텍스트와 이벤트를 list로 받아서 본문에 addStyle 및 addStringAnnotation으로 추가

반응형

'안드로이드 > 개발관련(Kotlin)' 카테고리의 다른 글

Gravity start TabRow (Compose)  (0) 2024.07.30
Glide Loading (Compose)  (0) 2024.07.30
눈금이 있는 Slide (Compose)  (0) 2024.07.30
분할 화면 (Compose)  (0) 2024.07.30
화면 분할 및 크기 조절 (Layout Split)  (0) 2024.05.15