본문 바로가기
Android/이것저것

[Android] setTextSize로 size 지정할 때 유의할 점

by 일상 속 둔치 2023. 6. 18.

안드로이드에서 사이즈를 지정할 때에는 DP,SP 등을 주로 사용하곤 한다.

 

왜냐하면 안드로이드 단말의 경우 해상도가 통일 되어 있지 않고 다른 경우가 많기 때문이다.

 

그래서 PX을 기준으로 하드코딩 하다보면 레이아웃이 뭉개지는 경우가 발생할 것이다.

 

자주 사용되는 몇가지 단위를 간단히 알아보고 가자면

 

단위

1. PX

실제 픽셀 수를 뜻한다. 테스트 단말을 기준 PX 값으로 코딩하게 되면 다른 단말에서 안맞을 것이다.

 

2. DP(DIP)

화면의 크기를 기준으로 하면서 비율 계산하여 같은 비율로 출력하게 해준다. 보통 PX로 하면 뭉개지기 때문에 DP를 많이 사용한다.

 

3. SP

글꼴의 단위로 많이 사용하며, 사용자가 선택한 Font Size에 영향을 받아서 scale이 커진다.

 

보통 view의 height/width를 지정해주는 경우 dp를 사용하고 글씨 크기는 sp를 사용한다.

 

단위 적용하기

이런 DP/SP 등의 수치를 적용할 때 바로 xml에 수치를 적어 넣을 수도 있지만 유지보수 측면을 생각하여 dimens에 정의를 하여 사용한다.

* res/values/dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textview_height">25dp</dimen>
    <dimen name="textview_width">150dp</dimen>
    <dimen name="ball_radius">30dp</dimen>
    <dimen name="font_size">16sp</dimen>
</resources>

그리고 사용할 때는 context의 resources로 가져오거나 xml에 적용할 수 있다.

val fontSize: Float = resources.getDimension(R.dimen.font_size)
<TextView
    android:layout_height="@dimen/textview_height"
    android:layout_width="@dimen/textview_width"
    android:textSize="@dimen/font_size"/>

 

setTextSize로 SP 적용했는데 사이즈가 커요

자 여기까지는 문제될 것이 없다.

그런데 예를 들어 아래처럼 TextView에 코드를 사용해서 setTextSize를 한다고 가정해보자.

setTextSize는 기본적으로 sp를 단위로 적용하게 되어있으며, 다른 단위로 지정해줄 때는 type을 적용해주면 된다.

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);

textView.setTextSize(fontSize);

위 처럼 반영하면 text size가 의도한 것과 다르게 엄청 크게 나타날 것이다.

 

그 이유는 간단하다.

 

dimen에는 sp로 정의 했지만 getDimension으로 가져온 float의 크기는 px로 변환된 값이기 때문이다.

 

px로 변환된 큰 값을 sp값인 것처럼 적용해주려니까 text size가 거대하게 보이는 것이다.

 

직관적으로는 sp로 정의한 값이니까 sp로 생각을 하게 되지만 동작은 그렇지 않아서 확인이 필요하다.

 

그렇다면?

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);

위처럼 type을 PX로 정해주면 원하는 sp가 px로 변환된 값으로 사용할 수 있다.

 

물론 setTextSize(20) 이런 식으로 sp를 바로 지정해줄 수도 있지만... 유지보수 측면에서 dimen 사용하는 것을 추천드린다.

 


 

다양한 픽셀 밀도 지원  |  Android 개발자  |  Android Developers

다양한 픽셀 밀도 지원 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 기기는 다양한 화면 크기(핸드셋, 태블릿, TV 등)로 제공될 뿐만 아니라 화면의

developer.android.com

 

Inconsistency when setting TextView font size in code and in resources

The official documentation does not seem to answer this, or I can't figure it out. Element (nevermind the AlertDialog, it happens on any TextView as well): TextView tv = (TextView) dialog.findVie...

stackoverflow.com

 

댓글