[Android] 위젯 속성 지정하는 헷갈리는 코드 (feat. Kotlin)
개발을 하다보면 가끔 어.. 이 속성 코드로는 어떻게 지정하더라..? 하는 부분이 있어서
이 포스팅에 계속 정리해놓고 가끔 들여다 보려고 한다.
FontFamily 코드로 지정
커스텀 font의 경우 res > font 폴더를 생성하고, 원하는 폰트 ttf 파일을 넣어준다.
그리고 font 폴더에 font.xml 파일을 만들어 폴더에 넣은 폰트들을 설정해주면 다음과 같이 사용할 수 있다.
binding.tvDate.typeface = resources.getFont(R.font.~)
✅ 레이아웃 파일에서는 android:fontFamily="~" 이지만, 코드로 지정할 때는 typeface 속성을 사용함
TextSize 코드로 지정
Text의 크기의 단위는 sp로 지정하여 디바이스의 OS 설정의 글자 크기에 영향을 받도록 한다.
binding.tvDate.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f)
Color 코드로 지정
1. 기본 제공 Color의 색상 사용
기본으로 제공되는 Color.java 파일에 들어가보면 BLACK, WHITE, RED, GRAY, LTGRAY 등을 볼 수 있다.
binding.tvDate.setTextColor(Color.BLACK)
2. values > colors.xml의 색상 사용
하지만 우리는 보통 커스텀 컬러를 지정해서 사용하기 때문에 resource에 지정한 색을 가져오고 싶은 경우가 더 많다.
그럴 때는 다음과 같이 ContextCompat.getColor를 사용한다.
binding.tvDate.setTextColor(ContextCompat.getColor(context, R.color.calendarColor))
✅ ContextCompat은 resource에서 값을 가져오거나 permission을 확인할 때 SDK 버전을 고려하지 않아도 되도록 처리된 클래스
Drawable 코드로 지정
사이즈를 직접 입력하는 경우 단위를 변환해야 하는 일이 발생한다.
특히 직접 사이즈를 입력하는 경우의 단위는 pixel이다. 따라서 같은 사이즈 값을 입력하더라도 레이아웃 파일에서 dp로 사이즈를 지정하는 경우와 다른 결과가 보여지게 된다. 이런 경우에는 직접 dp를 pixel로 변환해주어야 한다.
dp → px
fun dpToPx(dp: Int): Int {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dp.toFloat(),
Resources.getSystem().displayMetrics).toInt()
}