Android 리소스

timothy jeong·2021년 11월 2일
0

Android with Kotlin

목록 보기
10/69

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 클래스로 매끄럽게 매핑될 수 있다.

drawable

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도형의 윤곽선 지정

values

값으로 이용되는 문자열, 색상, 크기, 스타일 등의 리소스들이 저장되는 디렉터리이다.

다른 리소스들은 파일명이 R 인 파일명에 식별자로 추가되므로 코드에서 이 식별자로 구분해서 사용하낟. 하지만 value 에 있는 값들은 R 파일에 식별자로 등록되지 않고 리소스 파일에 값을 지정한 태그의 name 속성 값이 등록된다.

따라서 액티비티 코드 상에서는 getString(R.string.{name}) 이런 식으로 사용된다.

style

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 속성을 이용해서 적용한다.

color 디렉터리

그런데 좀 이상하지 않은가? 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

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"/>
profile
개발자

0개의 댓글