[안드로이드 / Kotlin] Snackbar에 커스텀 폰트 적용하기

2022. 11. 8. 11:20·Android
반응형

안녕하세요!

오늘은 안드로이드에서 메시지를 띄워주는 방법 중 하나인 Snackbar에 커스텀 폰트를 적용하는 방법에 대해

간단하게 설명 해드리고자 합니다😊

 

일반적으로 Snackbar를 이용할 때, 아래와 같은 코드를 사용합니다.

Snackbar.make(view, message, duration).show()

하지만 앱을 개발하다보면 자체 커스텀 폰트를 적용하는 경우가 많은데, 위 코드를 이용해 스낵바를 사용하게되면 시스템 폰트를 따라가도록 되어있습니다. 그래서 스낵바에 커스텀 폰트를 적용할 방법이 없을까하는 생각에 구글을 찾아본 결과,,,

StackOverFlow에서 좋은 코드를 찾았습니다! 

예전에 찾은 코드들은 Snackbar style 내 TextView를 찾아 해당 뷰의 typeface를 바꾸는 식의 코드가 많았었는데, 안드로이드 버전에 따라 호환성 문제가 발생하는 경우가 있었습니다.

이번에 찾은 코드는 MetricAffectingSpan() 을 이용해 SpannableStringBuilder의 'span'을 세팅하는 방법을 사용하고 있습니다.

 

(+ 아래 코드는 추가적으로 message 폰트 외에도 action 버튼에 사용될 폰트까지 적용할 수 있는 코드입니다.)

class CustomTypefaceSpan(private val typeface: Typeface) : MetricAffectingSpan() {
	
    override fun updateDrawState(paint: TextPaint?) {
    	paint?.let { p -> applyCustomTypeface(p, typeface) }
    }
    
    override fun updateMeasureState(paint: TextPaint) {
    	applyCustomTypeface(paint, typeface)
    }
    
    private fun applyCustomTypeface(paint: Paint, typeface: Typeface) {
    	paint.typeface = typeface
    }
}
fun Context.showSnackbar(
    view: View,
    duration: Int,
    message: String,
    actionMessage: String = "",
    actionEvent: () -> Unit = {}
) {
    val messageStringBuilder = SpannableStringBuilder(message)
    val customFont = ResourcesCompat.getFont(this, R.font.pretendard_medium)
    
    customFont?.let { font ->
    	messageStringBuilder.setSpan(
            CustomTypefaceSpan(font),
            0,
            message.length,
            Spanned.SPAN_EXCLUSIVE_INCLUSIVE
        )
        
        Snackbar.make(view, messageStringBuilder, duration).apply {
            if (actionMessage.isNotEmpty()) {
            	val actionMessageStringBuilder = SpannableStringBuilder(actionMessage)
                
                actionMessageStringBuilder.setSpan(
                    CustomTypefaceSpan(font),
                    0,
                    actionMessage.length,
                    Spanned.SPAN_EXCLUSIVE_INCLUSIVE
                )
                setAction(actionMesageStringBuilder) {
                    actionEvent()
                }
                setActionTextColor(ContextCompat.getColor(this@showSnackbar, R.color.yellow))
            }
        }.show()
    }
}

 

 

참고

https://stackoverflow.com/questions/73099407/kotlin-styling-text-in-snackbar-with-sdk-later-than-28

 

Kotlin: Styling Text in Snackbar with SDK later than 28

I am working on a Kotlin project and I wish to style the text in a Snackbar, specifically the text font. I have been to many websites that address this problem, but they all use this line in the Sn...

stackoverflow.com

 

반응형

'Android' 카테고리의 다른 글

[안드로이드 / Kotlin] 둥근 모서리 Bitmap 이미지 만들기  (0) 2022.11.18
[안드로이드 / Kotlin] RecyclerView 최상단 최하단 스크롤감지  (0) 2022.11.11
[안드로이드] ConstraintLayout 뷰 밀림 문제  (0) 2022.10.30
[안드로이드 / Kotlin] ViewPager2 setCurrentItem duration  (0) 2022.10.28
[안드로이드 / Kotlin] Moshi  (2) 2022.09.30
'Android' 카테고리의 다른 글
  • [안드로이드 / Kotlin] 둥근 모서리 Bitmap 이미지 만들기
  • [안드로이드 / Kotlin] RecyclerView 최상단 최하단 스크롤감지
  • [안드로이드] ConstraintLayout 뷰 밀림 문제
  • [안드로이드 / Kotlin] ViewPager2 setCurrentItem duration
서주냥
서주냥
안드로이드 개발 관련 끄적임
  • 서주냥
    AOS가 아니라 안드로이드
    서주냥
  • 전체
    오늘
    어제
    • 전체보기 (59)
      • 알고리즘 (12)
        • 백준 (4)
        • 프로그래머스 (5)
        • 개념 (3)
      • Android (44)
        • Compose (2)
      • Java (2)
      • Kotlin (1)
  • 링크

    • GitHub
  • 인기 글

  • 태그

    textunit
    투 포인터
    Coroutine
    코루틴
    Hilt
    컴포즈
    안드로이드
    Clean Architecture
    자바
    BLE
    클린 아키텍처
    최단 경로
    다이나믹 프로그래밍
    뷰모델
    lineHeight
    FusedLocationProviderClient
    Coroutine Flow
    프로그래머스
    코틀린
    viewpager2
    RecyclerView
    SnackBar
    textstyle
    debounce
    벨만 포드
    ConstraintLayout
    reified
    알고리즘
    블루투스
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
서주냥
[안드로이드 / Kotlin] Snackbar에 커스텀 폰트 적용하기
상단으로

티스토리툴바