Development/Android
[Android / Kotlin] 정규 표현식으로 Text에서 url 부분 Link 처리하기
SeungYong.Lee
2025. 6. 25. 09:45
반응형
- 간혹 전체 텍스트에 url이 중간에 섞여있고, 이 부분을 링크 처리하여 사용자가 바로 외부로 연결할 수 있도록 구현이 필요할 때 아래와 같은 함수를 구성해서 사용한다.
fun setHyperlinkedText(textView: TextView, rawText: String) {
val spannable = SpannableString(rawText)
val urlRegex = Regex("""https?://[^\s]+""")
val matches = urlRegex.findAll(rawText)
for (match in matches) {
val url = match.value
val start = match.range.first
val end = match.range.last + 1
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
widget.context.startActivity(intent)
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = Color.BLUE
ds.isUnderlineText = true
}
}
spannable.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance()
textView.highlightColor = Color.TRANSPARENT
}
- SpannableString을 통해 특정 Text 범위에 스타일 또는 링크 효과를 줄 준비를 한다.
- 정규표현식 "https?://[^\s]+"는 http:// 또는 https://로 시작하는 문자열을 인식한다.
val urlRegex = Regex("""https?://[^\s]+""")
- 그리고 전체 문자열을 기반으로 정규표현식에 맞는 부분을 찾아 Clickable 처리를 해준다. 여기서 UnderLine 및 링크 색상 지정이 가능
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
widget.context.startActivity(intent)
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = Color.BLUE
ds.isUnderlineText = true
}
}
- 이후 movementMethod를 지정하여 링크 클릭을 활성화하고, 클릭하는 순간에 배경은 따로 지정하지 않도록 해준다.
textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance()
textView.highlightColor = Color.TRANSPARENT
반응형