본문 바로가기
Kotlin

[Kotlin / Android] 09. 리소스 활용하기 - 리소스의 종류와 특징

by 쀼르쀼르 2024. 3. 11.

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


 

리소스(resource)

- 정적인 자원

- 앱 리소스플랫폼 리소스로 구분됨

 

앱 리소스 사용하기

개발자가 직접 추가한 리소스를 의미

개발자는 리소스 디렉터리에 리소스 파일을 각각 만듦

안드로이드 앱의 리소스 종류

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

 

리소스 디렉터리명은 고정이며

res 디렉터리 아래에 개발자가 임의로 이름을 붙인 디렉터리를 만들수 없음

하위 디렉터리 역시 추가할 수 없음

 

리소스 파일명은 values에 추가하는 파일을 제외하고는

모두 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없음

 

why?

리소스 디렉터리와 파일을 코드에서 그대로 사용하지 않고

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


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

화면을 구성하는 레이아웃 XML 파일을 저장하는 디렉터리


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

이미지 리소스를 저장하는 디렉터리

PNG, JPG, GIF, 9.PNG 파일 저장 가능

XML로 작성한 이미지도 저장할 수 있음

 

· XML로 작성한 이미지

<shape xmlns:android="http://schemas.android.com/apk/res/android"
	android:shape="rectangle">
    <gradient
    	android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45" />
    <corners android:radius="8dp" />
</shape>

 

XML 파일로 작성했지만 이미지 리소스처럼 ImageView 등에서 이용할 수 있음

 

· XML 이미지를 사용하는 예

<ImageView
	android:layout_width="300dp"
    android:layout_height="300dp"
    android:src="@drawable/gradient_box" />

 

 실행결과 

XML 이미지 태그

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

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

앱을 기기에 설치하면 나타나는 실행 아이콘의 이미지 리소스가 저장되는 디렉터리


값 리소스 - values 디렉터리

값으로 이용되는 리소스를 저장하는 디렉터리

문자열, 색상, 크기, 스타일, 배열 등의 값을 XML로 저장할 수 있음

 

activity_main.xml은

리소스를 코드에서는 R.layout.activity_main으로 이용함

 

values 디렉터리에 있는

문자열 리소스 파일인 strings.xml은 R.values.strings처럼 이용하지 않음

 


 

즉, values 디렉터리의 리소스 파일은파일명이 R인 파일에 식별자로 등록되지 않고

리소스 파일에 값을 지정한 태그의 name 속성값이 등록됨


 

· 문자열 리소스 등록

<resource>
    <string name="app_name">Test9</string>
    <string name="txt_data1">Hello</string>
    <string name="txt_data2">World</string>
</resource>

 

태그의 name 속성에 지정한 값이 R 파일에 식별자로 기록됨

 

· XML에서 문자열 리소스 사용

<TextView
    andriod: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)

 

values 디렉터리에 저장되는 리소스는 문자열 이외에도 색상, 크기, 스타일 등이 있음

 

· 색상 리소스 등록

<resources>
    <color name="txt_color">#FFF00</color>
    <color name="txt_bg_color">#FF0000</color>
</resources>

 

· 크기 리소스 등록

<resources>
    <dimen name="txt_size">20dp</dimen>
</resources>

 

· XML에서 색상과 크기 리소스 사용

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/txt_data1"
    android:textColor="@color/txt_color"
    android:background="@color/txt_bg_color"
    android:textSize="@dimen/txt_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)

 

· 스타일 등록

<resources>
    <style name="MyTextStyle">
    	<item name="android:textSize">@dimen/txt_size</item>
        <item name="android: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>

 

 

스타일을 정의할 때는 다른 스타일을 상속받아 재정의할 수 있음

MyTextStyleSub를 뷰에 적용하면 속성 3개가 적용됨

  • parent에 명시한 속성 2개를 상속받음
  • android:background라는 새로운 속성 추가
  • textColor라는 속성 재정의

 

· 스타일 리소스 사용

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

 


색상 리소스 - color 디렉터리

색상 리소스를 등록함

특정 뷰의 상태를 표현하고 그 상태에 적용되는 색상을 등록할 때 사용

 

· 색상 리소스 등록

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.andriod.com/apk/res/android">
    <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 디렉터리

글꼴 리소스를 저장함이곳에 TTF나 OTF 파일을 저장한 후 글꼴을 적용할 뷰에서 이용하면 됨

 

· 글꼴 리소스 사용

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="HelloWorld"
    android:textSize="20dp"
    android:fontFamily="@font/pacifico" />

 

 실행결과 

 


플랫폼 리소스 사용하기

안드로디으 스튜디오의 프로젝트 탐색 창에서 보기 옵션을

[Packages]로 설정한 후 [Libraries]항목을 살펴보면 확인할 수 있음

 

플랫폼 리소스는 앱에 있는 리소스가 아니므로

앱의 R 파일이 아니라 android.R이라는 플랫폼 라이브러리의 R 파일에 등록되어 있음

 

· 코드에서 플랫폼 리소스 사용

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

 

· XML에서 플랫폼 리소스 사용

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/alert_dark_frame"/>
    
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@android:string/emptyPhoneNumber"/>