res 디렉터리 하위에 위치한 리소스는 정적인 자원을 의미한다.
프로젝트를 새로 만들거나, 모듈을 새로 만들면 res 하위에 drawable, layout, mipmap, values 라는 디렉터리가 생긴다. 기본으로 4개의 디렉터리가 생기지만 더 많은 디렉터리가 있다.
디렉터리명 | 리소스 종류 |
---|---|
animator | 속성 애니메이션 XML |
anim | 트윈 애니메이션 XML |
color | 색상 상태 목록 정의 XML |
drawable | 이미지 리소스 |
mipmap | 앱 실행 아이콘 리소스 |
layout | 레이아웃 xml |
menu | 메뉴 구성 xml |
raw | 원시 형태로 이용되는 리소스 파일 |
values | 단순 값으로 이용되는 리소스 |
font | 글꼴 리소스 |
xml | 특정 디렉터리가 정의되지 않은 나머지 xml 파일 |
res 디렉터리 하위에는 임의로 디렉터리나 파일을 추가할 수 없다. 또한 values 하위에 추가하는 리소스 파일은 제외하고는 모두 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없다. 이러한 규칙들 덕분에 리소스 파일들이 R 클래스로 매끄럽게 매핑될 수 있다.
PNG, JPG, GIF 그리고 XML로 작성된 이미지와 벡터 이미지가 저장되는 곳이다.
<?xml version="1.0" encoding="utf-8"?>
<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 파일을 통해서 이러한 이미지를 만들 수 있다.
xml 이미지를 만들 때 사용하는 태그는 다음과 같다.
태크 | 설명 |
---|---|
shape | 이미지 모양을 지정할 수 있다, rectangle, oval, line, ring 이 있다. |
corners | 둥근 모서리를 그리는데 사용, shape 값이 rectangle 일 때만 적용 |
gradient | 그라데이션 색상 |
size | 도형의 크기 지정 |
solid | 도형의 색상 지정 |
stroke | 도형의 윤곽선 지정 |
값으로 이용되는 문자열, 색상, 크기, 스타일 등의 리소스들이 저장되는 디렉터리이다.
다른 리소스들은 파일명이 R 인 파일명에 식별자로 추가되므로 코드에서 이 식별자로 구분해서 사용하낟. 하지만 value 에 있는 값들은 R 파일에 식별자로 등록되지 않고 리소스 파일에 값을 지정한 태그의 name 속성 값이 등록된다.
따라서 액티비티 코드 상에서는 getString(R.string.{name})
이런 식으로 사용된다.
view 에 있는 여러 속성들을 한대 묶어서 관리할 수 있게 해주는 리소스이다.
위와 같은 path 상에 위치하며, keymap을 따로해서 style 을 추출하는 단축키를 지정하는게 속 편하다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="default_button">
<item name="android:layout_width">100dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@drawable/round_button</item>
<item name="android:textColor">@color/white</item>
<item name="android:textStyle">bold</item>
</style>
<style name="sub_button" parent="default_button">
<item name="android:layout_marginStart">25dp</item>
<item name="android:enabled">false</item>
</style>
</resources>
styles.xml 파일은 위와 같이 구성되어 있다. style 은 상속을 지원하는데, 위의 예시에서는 sub_button 스타일이 parent="default_button"
속성을 이용하여 default_button 스타일을 상속하고 있는 구조이다.
<Button
android:id="@+id/startButton"
android:text="@string/start"
style="@style/default_button" />
<Button
android:id="@+id/stopButton"
android:text="@string/stop"
style="@style/sub_button" />
<Button
android:id="@+id/resetButton"
android:text="@string/reset"
style="@style/sub_button" />
스타일은 View 에 style 속성을 이용해서 적용한다.
그런데 좀 이상하지 않은가? values 디렉터리는 분명 색상도 가지고 있다고 했다. 그런데 그보다 더 전에는 color 디렉터리가 따로 있다고 하는데, 왜 같은 역할을 하는 파일이 두개나 존재해야 하는 걸까?
values 하위의 color.xml 은 색상 하나를 리소스에 등록해서 사용하기 위해 사용한다. 색상 하나하나가 하나의 value 로 등록되는 것이다. 반면에 color 디렉터리에 있는 리소스는 특정 뷰의 상태를 표현하고 그 상태에 적용되는 색상을 등록할 때 사용한다.
에를 들어 버튼을 눌렀을때와 누르지 않았을 때의 색상을 리소스에 등록하고자 한다고 해보자, 각각의 색상을 value 하위에 등록해서 사용할 수도 있지만 color 디렉터리에 있는 하나의 xml 에 등록해서 적용하면 더 편리하다.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="">
<item android:state_pressed="true"
android:color="#ffff0000"/>
<item android:state_focused="true"
android:color="#ff0000ff"/>
<item android:color="#ff000000"/>
</selector>
이렇게 color 리소스를 만들고 color 속성에 등록하기만 하면 된다.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me!!"
android:textColor="@color/button_color" />
font 디렉터리는 글꼴 리소스를 저장한다. ttf 나 otf 파일을 저장한 후 글꼴을 적용할 뷰에서 이용하면 된다.
필요한 글꼴은 구글 폰트 에서 찾아서 다운로드 하면 된다. 다만 대문자와 - 가 들어가면 안되므로 폰트 명을 변경해야할 수도 있다.
<Button
android:id="@+id/startButton"
android:text="@string/start"
style="@style/default_button"
android:fontFamily="@font/fruktur_regular"/>
<Button
android:id="@+id/stopButton"
android:text="@string/stop"
style="@style/sub_button"
android:fontFamily="@font/fruktur_regular"/>
<Button
android:id="@+id/resetButton"
android:text="@string/reset"
style="@style/sub_button"
android:fontFamily="@font/fruktur_regular"/>
</LinearLayout>
이 코드에서는 view 에 직접 추가했지만, style 에 추가하는게 코드 길이를 더 줄이는 방법일 것이다.
이렇게 직접 font 를 다운 받는게 싫다면 desine editor 를 이용해서 바로 이용할 수 있는 리소스가 있는지 찾는 것도 현명한 방법일 것이다.
안드로이드 스튜디오를 package view 로 변경하고 libraries 를 보면 anim, color, drawable 등의 우리가 이미 익숙한 이름이 보인다. 이곳에 있는 리소스가 플랫폼 리소스이다.
플래폼 리로스도 R 파일에 등록된 식별자로 이용할 수 있다. 그런데 플랫폼 리소스는 앱에 있는 리소스가 아니므로 앱의 R 파일이 아니라 android.R 이라는 플랫폼 라이브러리의 R 파일에 등록되어 있다.
binding.image.setImageDrawable(ResourcesCompat.getDrawable(resources, android.R.drawable.alert_dark_frame, null))
binding.TextView.text=getString(android.R.string.emptyPhoneNumber)
말한대로 android.R 을 이용해서 리소스를 가져와야한다. xml 에서도 이용할 수 있다.
<ImageView
android:id="@+id/image"
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"/>