가변폰트를 적용하기 위해 android support-v4 v26 이상이 필요하다.
support 라이브러리는 v28에서 지원이 끝났으므로 androidx.appCompat 라이브러리로 대체하자.
build.gradle [app]
// kotlin-dsl
dependencies {
...
// implementation("com.android.support:support-v4:26.0.0") // appCompat으로 대체
implementation("androidx.appcompat:appcompat:1.5.1")
...
}
파일 이름은 resource 규칙을 따라간다 (소문자 + '_'만 가능)
xml 최상위 태그에 app 네임스페이스를 추가하고
android:font="@font/pretendard"
대신 app:font="@font/pretendard"
을 사용
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:font="@font/pretendard"
app:fontStyle="normal" />
</font-family>
app:fontVariationSettings="'wght' [font_weight값]"
compileSdkVersion
도 28 이상으로 설정해야 한다.설정할 수 있는 값은 weight(wght
), width(wdth
), italic(ital
), slant(slnt
), optical size(opsz
), grade(GRAD
)가 있으며 가변 폰트여도 해당 축 설정을 지원하지 않는 경우도 있다.
각 설정축에 대한 자세한 설명은 아래 참조
https://wit.nts-corp.com/2019/10/07/5686
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:font="@font/pretendard"
app:fontStyle="normal"
app:fontVariationSettings="'wght' 500" />
</font-family>
※ 23.2.22 추가
가변폰트는 android N 이하에서는 일부 기능이 제대로 동작하지 않는다.
android N 기기에서 다음과 같은 에러가 발생했다.
Fatal Exception: android.res.Resource$NotFoundException
발생 위치를 확인해 보았더니 xml 말고 코드상에서 수동으로 폰트를 적용하는 부분에서 리소스를 찾지 못해 발생한 에러였다.
fun TextView.setBoldText(bold: Boolean) {
(if (bold) R.font.pretendard_700 else R.font.pretendard_400)
.let { this.setTypeface(ResourceCompat.getFont(contet, it), Typeface.NORMAL)
}
이 부분은 버전 분기 처리를 통해 android O 이상이면 위 코드를 적용하고 미만이라면 Typeface.BOLD를 적용하는 방식으로 처리했다.