• 리소스 활용하기

안드로이드 프로그래밍은 리소스를 많이 이용한다는 특징이 있습니다.

layout, drawable 이외에도 많은 리소스를 등록하고 활용합니다.

단순히 res 디렉토리에 리소스 파일을 만들고 R 파일을 이용해 코드에서 참조하는 것 이외에 플랫폼 리소스도 있으며, 어떤 리소스를 특정 환경에 적용할지 명시하는 방법도 있습니다.

활용 조건 명시와 기기 크기와 호환하는 앱 개발을 위해 신경써야 하는 부분에 대해 알아봅니다.


09-1 리소스의 종류와 특징

리소스(Resource)란 정적인 자원을 뜻합니다.

앱이 동작하면서 변경되지 않는 콘텐츠는 리소스로 분리해서 외부 파일로 만들어 이용할 수 있습니다.

앱에서 이요하는 리소스는 앱 리소스플랫폼 리소스로 구분됩니다.

앱 리소스 사용하기

개발자가 직접 추가한 리소스를 의미합니다.

res 디렉토리와 하위 drawble, layout, mipmap, values 4개 디렉토리에 개발자가 리소스 파일을 만듭니다.

이 외에도 리소스 파일의 종류는 더 많습니다.

안드로이드 앱에서 이용되는 리소스의 종류는 아래와 같습니다.

디렉토리명 리소스 종류
animator 속성 애니메이션 XML
anim 트윈 애니메이션 XML
color 색상 상태 목록 정의 XML
drawable 이미지 리소스
mipmap 앱 실행 아이콘 리소스
layout 레이아웃 XML
menu 메뉴 구성 XML
raw 원시 형태로 이용되는 리소스 파일
values 단순 값으로 이용되는 리소스
xml 특정 디렉토리가 정의되지 않은 나머지 XML 파일
font 글꼴 리소스

디렑토리와 파일은 이름을 지을 때 규칙이 있습니다.

위 표의 리소스 디렉토리명은 고정이며 임의로 이름을 붙인 디렉토리를 만들 수 없고 하위 디렉토리 역시 추가할 수 없습니다.

파일명은 values에 추가하는 파일들을 제외하면 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없습니다.

R 파일에 식별자로 등록해서 이용하기 때문입니다.

 

레이아웃 리소스 - layout 디렉토리

화면을 구성하는 레이아웃 XML파일을 저장하는 디렉토리입니다.

 

이미지 리소스 - drawable 디렉토리

이미지 리소스를 저장하는 디렉토리 입니다. png, jpg, gif, webp 파일이 저장됩니다.

XML로 작성한 이미지도 저장할 수 있습니다.

XML 이미지를 만들 때 사용되는 태그는 아래와 같습니다.

태그 설명
<shape> 도형을 의미하며 android:shape="rectangle"처럼 속성을 이용해 도형의 타입을 지정.
rectangle, oval, line, ring 중 선택 가능
<corners> 둥근 모서리를 그리는 데 사용, shape값이 rectangle 일 때만 적용
<gradient> 그라디에션 색상 지정
<size> 도형의 크기 지정
<solid> 도형의 색상 지정
<stroke> 도형의 윤곽선 지정

 

실행 아이콘 리소스 - mipmap 디렉토리

앱의 실행 아이콘의 이미지 리소스가 저장되는 디렉토리입니다.

 

값 리소스 - values 디렉토리

문자열, 색상, 크기, 스타일, 배열 등을 XML로 저장할 수 있습니다.

layout 디렉토리에 activity_main.xml 파일은 R.layout.activity_main으로 이용합니다.

그런데 values 디렉토리에 있는 R 파일에 식별자로 등록되지 않고 파일에 값을 지정한 태그의 name 속성값이 등록됩니다.

따라서 values 디렉토리에 생성되는 color.xml, strings.xml등의 파일명은 권장할 뿐 자유롭게 정할 수 있으며 알파벳 대문자를 이용할 수도 있습니다.

<resources>
	<string name="app_name">AppName</string>
    <string name="txt_data1">Hello</string>
    <string name="txt_data2">World</string>
</resources>

strings.xml파일에 위처럼 작성했따면 name 속성의 값이 R파일에 식별자로 기록되어 레이아웃 XML과 코드에서 다음처럼 이용할 수 있습니다.

<TextView
	andorid:id="+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txt_data1/>
binding.textView.text=getString(R.string.txt_data2)

이 외에도 색상, 크기, 스타일 등이 있는데 색상 리소스는 color 태그로 등록, 크기 리소스는 dimen 태그로 등록하고 아래와 같ㅇ ㅣ사용합니다.

<Textview
	...
    android:textColor="@color/txtcolor"
    android:textSize="@dimen/text_size"/>
binding.textView.text=getString(R.string.txt_data2)
binding.textView.setTextColor=(ResourcesCompat.getColor(resources, R.color.txt_color, null))
binding.textView.textSize = resources.getDimension(R.dimen.txt_size)

 

스타일 리소는 style 태그로 등록합니다. 여러 속성을 스타일로 등록해 한꺼번에 적용하거나 중복되는 속성을 스타일로 정의해 재사용하는 용도로 쓰입니다.

<resources>
	<style name="MyTextStyle">
   	<item name="android:textSize">@dimen/txt_size</item>
        <item name="anroid:textColor">@color/txt_color</item>
    </style>
    <style name="MyTextStyleSub" parent="MyTextStyle">
    	<item name="android:textColor">#0000FF</item>
        <item name="android:background">@color/txt_bg_color</item>
    </style>
</resources>

MyTextStyle을 적용하면 스타일 두개 적용, MyTextStyleSub를 적용하면 parent와 맞물려 속성 세개가 적용됩니다.

 

<Textview
	android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/MyTextStyleSub"
    android:text="Hello World"/>

위와 같이 사용해 적용할 수 있습니다.

 

색상 리소스 - color 디렉토리

color 디렉토리에는 색상 리소스를 등록합니다.

색상 리소스는 values 디렉토리에 <color>태그로 등록할 수 있는데 왜 별도의 디렉토리가 있을까요 ?

color 디렉토리의 리소스는 특정 뷰의 상태를 표현하고, 그 상태에 적용되는 색상을 등록할 때 사용합니다.

예를 들어, 어떤 버튼을 눌렀을 때와 누르지 않았을 때의 색상을 리소스로 등록하고자 할 때, 버튼의 상태에 다른 색상을 하나의 XML에 등록해 적용하면 더 편리합니다. 이 때 color 디렉토리를 사용합니다.

<selector xmls...
	<item
    	android:state_pressed="true"
    	android:color="#ffff0000"/>
 	<item
    	android:state_focused="true"
        android:color="#ff0000ff"/>
    <item android:color="#ff000000"/>
</selector>

뷰를 눌렀을때와 뷰에 포커스가 주어졌을 때를 의미하는 색상을 지정하고, 각 상태의 기본 색상을 지정했습니다.

뷰에 등록해 사용할 때는 다음과 같습니다.

<Button
	android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Click Me !!"
    android:textColor="@color/button_text"/>

 

글꼴 리소스 - font 디렉토리

font 디렉토리는 글꼴 리소스를 저장합니다. 이곳에 TTF나 OTF 파일을 저장한 후 글꼴을 적용할 뷰에서 이용합니다.

<TextView
	...
    android:fontFamily="@font/pacifico"/>

 

플랫폼 리소스 사용하기

앱 리소스 외에 안드로이드 플랫폼이 제공하는 리소스가 있습니다.

스튜디오 프로젝트 탐색 창에서 보기 옵션을 [Packages]로 설정 후 [Libraries]항목을 살펴보면 확인할 수 있습니다.

플랫폼 리소스도 R 파일의 식별자로 이용할 수 있습니다.

그러나 앱 리소스가 아니라서 R 파일이 아니라서 android.R 이라는 플랫폼 라이브러리의 R 파일로 등록되어있습니다.

binding.imageView.setImageDrawable(ResourcesCompay.getDrawable(resources,
	android.R.drawable.alert_dark_frame, null))
binding.textView.text=getString(android.R.string.emptyPhoneNumber)

 

XML에서 앱 리소스는 @기호로 R파일의 리소스를 이용했습니다.

플랫폼의 리소스를 XML 파일에서 이용할 때는 @android:패턴으로 사용합니다.

@android:drawable/save 와 같은 형식으로 사용합니다.

 

09-2 리소스 조건 설정

리소스를 특정 환경에서 적용되도록 설정하는 것을 말합니다.

만약 기기마다 화면 크기가 달라지면 특정 이미지가 선명하게 나오지 않는 문제가 발생합니다.

기기별 실행 아이콘 크기는 다음과 같습니다.

화면 밀도 크기
XXXHDPI 192 * 192
XXHDPI 144 * 144
XHDPI 96 * 96
HDPI 72 * 72
MDPI 48 * 48

따라서 보통 앱을 개발할 때에는 아이콘을 5개씩 준비해야 합니다.

그런데 모두 같은 이름으로 저장할 수 없어 디렉토리 이름 뒤에 붙임표(-)와 조건을 추가합니다.

  • mipmap-mdpi/ic_launcher.png
  • mipmap-hdpi/ic_launcher.png
  • mipmap-xhdpi/ic_luancher.png
  • ...

 

리소스 디렉토리명에 지정할 수있는 조건은 다음과 같습니다.

조건 예시 설명
MCC 및 MNC mcc310
mcc310-mnc004
이동통신 국가 코드(MCC)와 선택적으로 이동통신 네트워크 코드(MNC) 추가 가능. mcc310(미국), mcc310-mnc004(버라이즌)
언어 및 지역 en
ko-rKR
ISO639-1 언어 코드이며 선택적으로 뒤에 나올 소문자 r을 추가해 ISO3166-1-alpha-2의 지역 코드가 나올 수 있음
레이아웃 방향 ldrtl
ldltr
히브리어처럼 우→좌 로 쓰는 언어의 레이아웃 이용
ldrtl은 우에서 좌, ldltr은 좌에서 우 방향 레이아웃
더 작은 쪽 sw320dp 화면 방향과 상관없이 화면의 높이와 너비 중 작은 쪽에 대한 조건을 의미 sw320dp 이면 너비든 높이든 상관없이 작은 쪽의 치수가 320dp 인경우를 의미
이용 가능한 너비 w720dp 화면 너비에 대한 조건. w720dp이면 너비가 720 인 기기
이 외의 다양한 조건을 아래 문서에서 확인 가능
https://developer.android.com/guide/topics/resources/providing-resources?hl=ko#AlternativeResources

이런 다양한 조건을 어느 리소스 디렉토리에 적용할 지는 개발자의 선택에 달렸습니다.

예를 들어 언어 조건은 values디렉토리에 적용해 values-ko-rKR로, drawable 디렉토리에 적용해 drawable-ko-rKR로 사용할 수 있습니다.

이어 붙여 여러 조건을 지정해도 됩니다.

그러나 위 표의 순서대로 조건을 지켜야 합니다.

 

화면 회전에 대응하기

화면 회전에 대응하려면 가로와 세로 방향일 때 출력할 레리아웃 XML 파일을 각각 준비해야 합니다.

그리고 어느 방향에서 어떤 XML을 출력할지 지정해야 하빈다.

이를 리소스 조건으로 설정해 처리하면 편리합니다.

 

가로, 세로 방향에 적용할 레이아웃 XML 파일을 만들고 각 리소스 디렉토리명에 조건을 명시해 저장합니다.

세로방향 xml파일은 layout 디렉토리에, 가로방향 xml 파일은 layout-land 디렉토리에 저장합니다.

 

국제 언어 제공하기

이 부분도 리소스 조건 설정으로 처리합니다.

strings.xml 파일에 <string> 태그로 문자열 리소스를 작성하는데, 파일을 여러개 만들어서 각 언어에 맞는 리소스 문자열을 담고 어느 XML 파일을 적용해야 하는지를 리소스 디렉토리명으로 지정하면 됩니다.

<resources>
	<string name="app_name">TextEnglish</string>
    <string name="intro">Hello</string>
</resources>
<resources>
	<string name="app_name">테스트</string>
    <string name="intro">안녕하세요</string>
</resources>

문자열 리소스는 values 디렉토리의 리소스이므로 식별자는 파일명이 아니라 태그의 name 값입니다.

따라서 각 파일에 문자열을 등록할 때 name값은 같아야 합니다.

 

09-3 폰 크기의 호환성

폰 크기의 호환성은 안드로이드 시스템에서 도와주는 부분이 있고 개발자가 직접 해결해야 하는 부분이 있습니다.

논리적인 단위 알아보기

크기 설명
ldpi 저밀도 화면 ~120dpi
mdpi 중밀도 화면 ~160dpi
hdpi 고밀도 화면 ~240dpi
xhdpi 초고밀도 화면 ~320dpi
xxhdpi 초초고밀도 화면 ~480dpi
xxxhdpi 초초초고밀도 화면 ~640dpi

 

위 표처럼 기기의 크기를 구분해 콘텐츠의 크기를 늘리거나 줄이도록 안드로이드 시스템이 돕습니다.

하지만 이 도움을 받으려면 개발자가 콘텐츠의 크기를 지정할 때 논리적인 단위를 사용해야 합니다.

앱 개발시 크기 지정에 사용할 수 있는 단위는 다음과 같습니다.

  • dp(dpi: density-independent pixels): 스크린의 물리적 밀도에 기반을 둔 단위
  • sp(sip: scale-independent pixels): dp와 유사하며 글꼴 크기에 적용
  • pt(points): 스크린 크기의 1/72를 1pt로 함
  • px: 픽셀
  • mm: 밀리미터
  • in: 인치

화면 정보 가져오기

안드로이드 시스템은 기본으로 크기 호환성을 지원하지만 때로는 개발자가 직접 코드에서 조정할 수도 있습니다.

이때 기기의 크기 정보를 가져오기위해 API를 사용합니다.

30 이전 버전에서는 DisplayMetrics로 크기 정보를 가져왔지만, 이 후부터는 WindowMetrics를 이용해야 합니다.

아래는 버전에 따라 다르게 적용하는 예시입니다.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
	val windowMetrics: WindowMetrics = windowManager.currentWindowMetrics
    binding.textView.text = "width: ${windowMetrics.bounds.width()}, hieght:
    ${windowMetrics.bounds.height()}"
}else{
	val display = windowManager.defaultDisplay
    val displayMetrics = DisplayMetrics()
    display?.getRealMetrics(displayMetrics)
    binding.textView.text =
    	"width: ${displayMetrics.widthPixels}, height: ${displayMetrics.heightPixels}"
}

Build.VERSION.SDK_INT는 앱이 실행되는 기기의 버전값이며 Build.VERSION_CODES.R은 안드로이드 11버전, API 레벨30을 의미합니다.

 

09-4 메신저 앱의 인트로 화면 만들기

(실습)

'Java > Kotlin' 카테고리의 다른 글

Kotlin Programming Study - 08  (0) 2025.12.17
Kotlin Programming Study - 07  (0) 2025.12.16
Kotlin Programming Study - 06  (0) 2025.12.15
Kotlin Programming Study - 04  (0) 2025.12.10
Kotlin Programming Study - 03  (0) 2025.12.09

+ Recent posts