본문 바로가기

Android/정보

텍스트뷰(TextView) 관련 짜투리 지식 1 (특정 문자열 색상 설정, 밑줄 긋기, 특정 문자열 폰트 설정)

1. 특정 문자열 색상 설정

텍스트뷰의 문자열에서 특정 구간의 색상을 따로 설정하고 싶은 경우가 있습니다. 이 경우 아래와 같이 사용하면 됩니다.

val keyword = item.keyword
            if (keyword != null && item.name.indexOf(keyword) != -1) {
                val start = item.name.indexOf(keyword)
                val end = keyword.length + start
                var spannableString = SpannableString(item.name)
                spannableString.setSpan(ForegroundColorSpan(
                    Color.parseColor("#FFFAD225")),
                    start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
                binding.itemSearchText.setText(spannableString)

start는 특정 문자열이 전체 문자열에서 몇 번째에 시작하는지, end는 몇 번째에 끝나는지를 나타내는 변수입니다.

이후 spannableString을 사용해 이 구간 안에 있는 문자열에 대해서만 색상을 설정해주면 됩니다.

이후 이 spannableString을 텍스트뷰에 설정하면 됩니다.

2. 텍스트뷰 밑줄

텍스트뷰에 밑줄을 설정하는 방법은 다양하지만, 전 아래와 같은 방법을 주로 사용합니다.

binding.specificReviewGotoWrite.paintFlags = Paint.UNDERLINE_TEXT_FLAG

해당 플래그를 설정하면 간편하게 밑줄을 설정할 수 있습니다.

3. 특정 문자열 폰트 설정

위의 특정 문자열 색상을 바꾸는 것과 원리는 동일합니다.

그러나 API 수준에 따라서 다른 방법을 사용할 수 있습니다.

먼저 API 수준이 28보다 높다면, 위 방법을 사용할 수 있습니다.

val font = Typeface.create(ResourcesCompat.getFont(binding.root.context, R.font.noto_sans_kr_bold),
Typeface.NORMAL)
spannableString.setSpan(TypefaceSpan(font), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

그러나 API 수준이 28 이하라면 위 방법을 사용할 수 없습니다. 이 경우 커스텀 클래스를 사용하여 해결할 수 있습니다.

val font = Typeface.create(ResourcesCompat.getFont(binding.root.context, R.font.noto_sans_kr_bold),
Typeface.NORMAL)
spannableString.setSpan(CustomTypefaceSpan(font),start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

커스텀 클래스는 아래와 같습니다.

class CustomTypefaceSpan(private val typeface: Typeface?) : MetricAffectingSpan() {
    override fun updateDrawState(paint: TextPaint) {
        paint.typeface = typeface
    }

    override fun updateMeasureState(paint: TextPaint) {
        paint.typeface = typeface
    }
}

 

728x90
반응형