[Android Study] 리소스

728x90
반응형

- 안드로이드 앱 개발에서 resource란 정적인 자원이라고 할 수 있다. 앱이 동작하더라도 변경되지 않는 정적인 콘텐츠는 코드에 작성하지 않고 리소스로 분리해서 외부 파일로 만들어 이용할 수 있다. 앱에서 이용하는 리소스는 크게 앱 리소스와 플랫폼 리소스로 구분된다.

 

* 앱 리소스

- 앱 리소스란 개발자가 직접 추가한 리소스를 의미한다. 앱을 개발하기 위해 모듈을 만들면 자동으로 res 디렉토리가 생기고 그 아래에 drawable, layout, mipmap, values 라는 디렉토리 4개가 생성된다. 개발자는 이 리소스 디렉토리에 리소스 파일을 만들면 된다. 이 4가지 말고도 추가로 더 만들수도 있다.

 

 - 하지만, 리소스 파일을 만들 때는 이름짓는 규칙이 있다. 그냥 마구잡이로 aaa.xml, aaa 디렉토리 이런식으로 만들 수는 없다. res 디렉토리 아래에 개발자가 임의로 이름을 붙인 디렉토리를 만들 수 없고 하위 디렉토리 역시 추가할 수 없다. 또한, 리소스 파일명은 values에 추가하는 파일을 제외하고는 모두 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없다. 이런 규칙이 있는 이유는 리소스 디렉토리와 파일을 코드에서 그대로 사용하지 않고 R 파일에 식별자로 등록해서 이용하기 때문이다.

 

  • 레이아웃 리소스 - layout 디렉토리
    • 화면을 구성하는 레이아웃 XML 파일을 저장하는 디렉토리이다.
  • 이미지 리소스 - drawable 디렉토리
    • 이곳에 저장할 수 있는 이미지는 PNG, JPG, GIF, 9.PNG 파일이다. 또한, 아래와 같이 XML로 작성한 이미지도 이 디렉토리에 저장할 수 있다. 
    • drawable/gradient_box.xml을 만들고 activity_main.xml에서 불러와서 사용한 예이다.

  • 실행 아이콘 리소스 - mipmap 디렉토리
    • 앱을 설치한 기기에 나타나는 실행 아이콘의 이미지 리소스가 저장되는 디렉토리이다.
  • 값 리소스 - values 디렉토리
    • 값으로 이용되는 리소스를 저장하는 디렉토리이며 문자열, 색상, 크기, 스타일, 배열 등의 값을 XML로 저장할 수 있다. 그런데 values에 저장되는 리소스는 다른 디렉토리의 리소스와 이용 방법이 조금 다르다. 다른 디렉토리의 리소스는 파일명이 R인 파일에 식별자로 추가되므로 코드에서 이 식별자로 구분해서 사용한다.
    • 예를들어 layout 디렉토리에 있는 activity_main.xml 파일은 코드에서 R.layout.activity_main으로 이용한다. 하지만, values 디렉토리에 strings.xml은 R.values.strings로 이용하지 않는다.
    • values 디렉토리의 리소스 파일은 파일명이 R인 파일에 식별자로 등록되지 않고 리소스 파일에 값을 지정한 태그의 name 속성값으로 등록된다. 따라서, values 디렉토리의 있는 xml 파일명은 권장할 뿐 개발자가 자유롭게 정할 수 있고 알파벳 대문자를 사용할 수도 있다. 
    • 문자열 리소스를 등록하고 사용하려면 다음과 같이 사용하면 된다. 아래는 strings.xml에 txt_data1을 등록하고 다른 파일에서 사용하는 예이다.
// values 디렉토리에 문자열 리소스 등록
<resources>
    <string name="app_name">Test</string>
    <string name="txt_data1">Hello</string>
</resources>
// XML 파일에서 문자열 리소스 사용
<TextView
    android:id="@+id/textView"
    android:layout_width:"wrap_content"
    android:layout_height:"wrap_content"
    // strings.xml에 있는 txt_data1을 사용한다는 뜻
    android:text="@string/txt_data1" />
// main코드에서 문자열 리소스 사용
binding.textView.text = getString(R.string.txt_data1)
  • 스타일 리소스 - values 디렉토리
    • 스타일 리소스는 style 태그로 등록한다. 스타일을 정의할 때는 다른 스타일을 상속받아 재정의할 수 있다.  
    • 아래 예시는 MyTextStyle을 정의하고 아래 MyTextStyleSub에서 상속받아 작성한 것이다. 이렇게 설정하고 MyTextStyleSub를 뷰에 적용하면 속성 3개가 작용된다. (textColor는 중복되는 속성이므로 Sub에서 설정한 색깔로 재정의된다.)
<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>
  • 색상 리소스 - color 디렉토리
    • 검색해보니 color는 그냥 values에 color.xml로 많이 쓰는 것 같다..

 

* 플랫폼 리소스

- 개발자가 따로 등록하지 않아도 안드로이드 플랫폼에서 제공하는 많은 기본 리소스들이 있다. 플랫폼 리소스는 안드로이드 스튜디오의 프로젝트 탐색 창에서 보기 옵션을 [Packages]로 설정한 뒤 맨 아래 [Libraries]를 눌러보면 확인할 수 있다.

 - 플랫폼 리소스도 R파일에 등록된 식별자로 이용할 수 있다. 그런데, 플랫폼 리소스는 앱에 있는 리소스가 아니므로 앱의 R 파일이 아니라 android.R 이라는 플랫폼 라이브러리의 R 파일에 등록되어있다. 따라서 사용하려면 android.R.string.emptyPhoneNumber 와 같이 사용해야 한다.

 - XML에서도 마찬가지로 @string/emptyPhoneNumber가 아닌 @android:string/emptyPhoneNumber 로 이용해야 한다.

728x90
반응형
TAGS.

Comments