본문 바로가기

JAVA/Android

[JAVA][Android] SpannableStringBuilder로 TextView의 일부에만 스타일 지정하기

SpannableStringBuilder는 Text의 스타일을 지정할 때 이용하는 인터페이스 중 하나로,
주로 인터페이스의 setSpan 메소드를 활용하여 뷰의 일부 문자에만 스타일을 지정할 수 있다.

 

*공식 사이트 참고

https://developer.android.com/reference/android/text/SpannableStringBuilder

 

SpannableStringBuilder  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

간단한 활용 예시를 보자

 

import android.text.SpannableStringBuilder
import android.text.Spanned

import android.text.style.StyleSpan
import android.text.style.UnderlineSpan
import android.text.style.AbsoluteSizeSpan
import android.text.style.ForegroundColorSpan

class MainTextActivity : BaseTextActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setTextSpan(0, 5)
    }

    private fun textSpanQuizResult(int startIndex, int endIndex){
        var text = String.format(resources.getString(R.string.sample_text), 10)
        val spanBuilder = SpannableStringBuilder(text)
        
        /**check point!*/
        //1. COLOR
        spanBuilder.setSpan(ForegroundColorSpan(Color.BLUE), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        //2. SIZE
        spanBuilder.setSpan(AbsoluteSizeSpan(30, true), startIndex,endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        //3. FONT
        spanBuilder.setSpan(StyleSpan(Typeface.BOLD), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_INCLUSIVE)
        //4. UNDERLINE
        spanBuilder.setSpan(UnderLineSpan(), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_INCLUSIVE)

        val view = findViewById<TextView>(R.id.textView)
        view.text = spanBuilder
    }
}

setSpan 메소드를 호출한 부분을 살펴보면 (check point 부분)
색상, 크기, 폰트, 밑줄 의 케이스로 네 번 호출하여 TextView의 스타일을 지정한 것을 확인할 수 있다.
첫번째 인자에 들어가는 값은 Custom한 클래스를 이용하여 원하는 스타일로 표현도 가능하다.

 

위와 같이 설정한 spanBuilder를 TextView 객체에 반영해주면 된다.

 

SpannableStringBuilder.java

/**
 * Mark the specified range of text with the specified object.
 * The flags determine how the span will behave when text is
 * inserted at the start or end of the span's range.
 */
public void setSpan(Object what, int start, int end, int flags) {
    setSpan(true, what, start, end, flags, true/*enforceParagraph*/);
}

인터페이스에 정의된 setPan 메소드를 살펴보자.

 

첫번째 인자인 what에는 어떤 속성을 설정할 것인지를 정의한다.
두번째, 세번째 인자는 뷰 내부에서 설정할 텍스트의 범위를, 
마지막 인자는 안드로이드 공식 사이트의 Summary에서 쉽게 확인할 수 있다.

 

https://developer.android.com/reference/android/text/Spanned.html

 

Spanned  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com