Android Resources
안녕하세요. 제임스 입니다.
이번에는 Android 의 Resource 에 관한 내용을 다루고자 합니다.
■ Android Resources 란?
안드로이드에서 리소스란 이미지, 텍스트, 화면 구조 등 화면을 그리는데 필요한 요소들을 통틀어 리소스라 칭합니다.
위 이미지중 res 폴더 아래 있는 것들이 모두 안드로이드 리소스 입니다.
안드로이드 리소스에는 이미지, xml 형식의 레이아웃, 앱 아이콘, value 로 정의 되는 arrays, strings, styles, dimens, colors 등이 있습니다.
모든 리소스는 res 폴더 아래에 있어야 하며 그 아래에 drawable, layout, menu, mipmap, values 등의 디렉토리를 제공하여 각각의 특징에 맞는 리소스를 관리하고 있습니다.
■ Resources 유형
res 디렉토리 내부에서 지원되는 리소스 디렉토리 구조 및 유형은 아래와 같습니다.
res/
animator/ 속성 애니메이션을 정의하는 XML 파일
anim/ 두 가지 이상의 속성 애니메이션을 정의하는 XML 파일
color/ 색상의 상태 목록 정의 XML 파일
drawable/ 이미지 (.png, .9.png, .jpg, .gif) 또는 XML 파일
mipmap/ 단말 해상도에 따른 런처 아이콘 이미지 지정 디렉토리
layout/ 화면 인터페이스 레이아웃을 정의하는 XML 파일
menu/ 옵션 메뉴, 컨텍스트 메뉴 또는 하위 메뉴 등과 같은 애플리케이션 메뉴를 정의하는 XML 파일
raw/ 원시 형태로 저장하기 위한 임의의 파일 저장
value/ 문자열, 색, 치수(길이, 사이즈), 스타일 등을 정의한 XML 파일
xml/ Resources.getXML() 을 호출하여 런타임에 읽을 수 있는 임의의 XML 파일
주의 할 점은 리소스 파일을 res 폴더 아래에 직접 저장할 경우 컴파일러 오류를 초래하게 되므로 꼭 지정된 디렉토리 아래에 저장 하셔야 합니다.
■ 대체 리소스 제공
기본적으로 Defalt 리소스를 제공하지만 대체 리소스 역시 제공해야 하는 경우가 대부분입니다.
예를 들면 단말 해상도에 따라 사이즈가 다른 이미지를 제공해야 하며, 단말 설정 언어값에 따라 다른 언어 문자열을 제공해야 하기도 합니다.
Android 가 런타임에 현재 기기 구성을 감지하고 적절한 리소스를 로드합니다.
대체 리소스 구성 방법은 아래과 같습니다.
res/ 디렉토리 아래에 <resources_name>-<config_qualifier> 형식으로 이름을 지정하여 새 디렉토리를 만듭니다.
☞ <resources_name> 은 위에 언급한 유형별 디렉토리 명칭을 의미합니다 (color, layout, value 등등)
☞ <qualifier> 는 개별 구성을 지정하는 이름입니다.
☞ 하나 이상의 <qualifier> 를 추가 할 수 있으며 각기 대시(-) 로 구분합니다.
☞ <qualifier>에는 아래와 같은 값들이 있습니다.
구성 | Qualifier 값 | 설명 |
---|---|---|
MCC 및 MNC | 예:mcc310
mcc208-mnc00 등 | 이동통신 국가 코드(MCC)에 선택적으로 이동통신 네트워크 코드(MNC)가 이어지는 형태로, 기기의 SIM 카드에서 가져옵니다. 예를 들어, 기기가 무선 연결(GSM 전화)을 사용할 경우, MCC와 MNC 값은 SIM 카드에서 가져옵니다. MCC만 단독으로 사용할 수도 있습니다(예를 들어, 애플리케이션에 국가별 합법적 리소스를 포함하는 경우). 언어에 기초해서만 지정해야 할 경우, 언어 및 지역 한정자를 대신 사용합니다(아래에 설명). MCC와 MNC 한정자를 사용할 경우, 조심해서 사용하고 예상한 대로 작동하는지 테스트해야 합니다. 또한, 구성 필드 |
언어 및 지역 | 예:en fr en-rUS fr-rFR fr-rCA 등 | 언어는 두 글자의 ISO 639-1 언어 코드로 정의되고, 뒤이어 두 글자의 ISO 3166-1-alpha-2 지역 코드(앞에 소문자 ' 코드는 대소문자를 구별하지 않습니다. 사용자가 시스템 설정에서 언어를 변경할 경우 애플리케이션 수명 중에 변경될 수 있습니다. 런타임에서 애플리케이션에 어떤 영향을 미치는지 자세히 알아보려면 런타임 변경 처리를 참조하세요. 다른 여러 언어에 맞게 애플리케이션을 현지화하기 위한 전체 지침은 현지화를 참조하세요. 또한, 현재 로케일을 나타내는 |
레이아웃 방향 | ldrtl ldltr | 애플리케이션의 레이아웃 방향입니다. 이는 레이아웃이나 드로어블, 값 등의 모든 리소스에 적용할 수 있습니다. 예를 들어, 아랍어에 대한 특정 레이아웃을 제공하고 다른 "오른쪽에서 왼쪽으로 쓰는" 언어(히브리어 또는 페르시아어)에 제네릭 레이아웃을 제공하고 싶다면 다음과 같이 해야 합니다. res/ layout/ main.xml (Default layout) layout-ar/ main.xml (Specific layout for Arabic) layout-ldrtl/ main.xml (Any "right-to-left" language, except for Arabic, because the "ar" language qualifier has a higher precedence.) 참고: 앱에서 오른쪽에서 왼쪽 레이아웃 기능을 활성화하려면 API 레벨 17에서 추가되었습니다. |
smallestWidth | sw<N>dp 예: sw320dp sw600dp sw720dp 등 | 화면의 기본 크기로, 사용 가능한 화면 영역의 가장 짧은 치수로 나타냅니다. 구체적으로 기기의 smallestWidth는 해당 화면의 이용 가능한 높이와 너비의 가장 짧은 치수를 말합니다(이것을 화면에 대한 "가능한 한 가장 좁은 너비"로 생각해도 됩니다). 이 한정자를 사용하면 화면의 현재 방향에 관계없이 애플리케이션이 해당 UI에서 이용 가능한 너비 중 최소 예를 들어, 레이아웃에 언제나 600dp 이상의 화면 최소 치수가 필요하다면, 이 한정자를 사용하여 레이아웃 리소스 기기의 smallestWidth는 화면 장식과 시스템 UI를 감안합니다. 예를 들어, 화면 상에서 최소 너비의 축 주변 공간을 차지하는 영구 UI 요소가 있다면, 시스템은 smallestWidth를 실제 화면 크기보다 작게 선언합니다. 이것은 개발자의 UI가 사용할 수 없는 화면 픽셀이기 때문입니다. 따라서 개발자가 사용하는 값은 레이아웃에서 요구하는실제 최소 치수여야 합니다. (일반적으로 이 값은 화면의 현재 방향과 관계없이 레이아웃이 지원하는 "최소 너비"가 됩니다.) 다음의 몇몇 값은 일반적인 화면 크기에 대해 사용할 수 있습니다.
애플리케이션이 smallestWidth 한정자의 여러 값이 포함된 여러 리소스 디렉터리를 제공하면, 시스템은 기기의 smallestWidth에 가장 가까운(그러나 이를 초과하지 않는) 값을 사용합니다. API 레벨 13에서 추가되었습니다. 이외에도 애플리케이션과 호환되는 최소한의 smallestWidth를 선언하는 여러 가지 화면에 맞는 디자인과 한정자 사용에 관한 자세한 정보는 다중 화면 지원 개발자 가이드를 참조하세요. |
이용 가능한 너비 | w<N>dp 예: w720dp w1024dp 등 | 리소스를 사용해야 하는 애플리케이션이 이 구성에 대해 서로 다른 값이 포함된 여러 개의 리소스 디렉터리를 제공하면, 시스템은 기기의 현재 화면 너비에 가장 가까운(그러나 이를 초과하지 않는) 값을 사용합니다. 이 값은 화면 장식을 감안한 것이므로, 기기의 왼쪽이나 오른쪽 가장자리에 영구 UI 요소가 있을 경우, 기기는 이러한 UI 요소를 감안하여 애플리케이션의 이용 가능한 공간을 줄여서 실제 화면 크기보다 작은 너비 값을 사용합니다. API 레벨 13에서 추가되었습니다. 현재 화면 너비를 보유한 여러 가지 화면에 맞는 디자인과 한정자 사용에 관한 자세한 정보는 다중 화면 지원 개발자 가이드를 참조하세요. |
이용 가능한 높이 | h<N>dp 예: h720dp h1024dp 등 | 리소스가 사용되어야 하는 최소한의 사용 가능한 화면 높이를 "dp" 단위로 나타냅니다. 이는 애플리케이션이 이 구성에 대해 서로 다른 값이 포함된 여러 개의 리소스 디렉터리를 제공하면, 시스템은 기기의 현재 화면 높이에 가장 가까운(그러나 이를 초과하지 않는) 값을 사용합니다. 이 값은 화면 장식을 감안한 것이므로, 기기의 상단이나 하단 가장자리에 영구 UI 요소가 있을 경우, 기기는 이러한 UI 요소를 감안하여 애플리케이션의 이용 가능한 공간을 줄여서 실제 화면 크기보다 작은 높이 값을 사용합니다. 상태 표시줄에 고정되지 않은 화면 장식(예를 들어 전화 상태 표시줄은 전체 화면에서 숨길 수 있음)은 여기에서 감안하지 않았고, 제목 표시줄이나 작업 모음 등의 창 장식도 감안되지 않았으므로, 애플리케이션 입장에서는 자신이 지정한 것보다 어느 정도 작은 공간을 받아들일 대비를 해야 합니다. API 레벨 13에서 추가되었습니다. 현재 화면 너비를 보유한 여러 가지 화면에 맞는 디자인과 한정자 사용에 관한 자세한 정보는 다중 화면 지원 개발자 가이드를 참조하세요. |
화면 크기 | small normal large xlarge |
참고: 크기 한정자를 사용하더라도 해당 리소스가 그 크기의 화면 전용이라는 뜻은 아닙니다. 현재 기기 구성과 더욱 잘 맞는 한정자가 포함된 대체 리소스를 제공하지 않으면, 시스템이 가장 잘 일치하는 리소스를 사용합니다. 주의: 모든 리소스가 현재 화면보다 큰 크기 한정자를 사용하는 경우, 시스템은 리소스를 사용하지 않으며 애플리케이션은 런타임에 작동이 중단됩니다(예: 모든 레이아웃 리소스에 API 레벨 4에서 추가되었습니다. 자세한 정보는 다중 화면 지원을 참조하세요.
|
화면 비율 | long notlong |
API 레벨 4에서 추가되었습니다. 이것은 순전히 화면 비율에만 기초합니다("긴" 화면이 더 넓습니다). 이는 화면 방향과 관계가 없습니다.
|
원형 화면 | round notround |
API 레벨 23에서 추가되었습니다.
|
화면 방향 | port land |
이것은 사용자가 화면을 돌리는 경우 애플리케이션 수명 중에 변경될 수 있습니다. 이것이 런타임에 애플리케이션에 어떤 영향을 미치는지 알아보려면 런타임 변경 처리를 참조하세요.
|
UI 모드 | car desk television |
API 레벨 8에서 추가되었고, 텔레비전은 API 13에서, 시계는 API 20에서 추가되었습니다. 기기가 도크에 삽입되거나 제거될 때 앱이 응답하는 방식에 관한 정보는 도킹 상태 및 유형 판별과 모니터링을 읽어보세요. 이것은 사용자가 기기를 도크에 놓는 경우 애플리케이션 수명 중에 변경될 수 있습니다. 이러한 모드 중 몇 가지는 |
야간 모드 | night notnight |
API 레벨 8에서 추가되었습니다. 이것은 야간 모드가 자동 모드인 상태(기본)에서 애플리케이션의 수명 중에 변경될 수 있습니다. 이 경우 모드는 하루 중 시간대를 기반으로 변경됩니다. 이 모드는 |
화면 픽셀 밀도(dpi) | ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi |
여섯 가지 기본 밀도간에 3:4:6:8:12:16 비율 척도가 있습니다(tvdpi 밀도는 무시). 그러므로 ldpi의 9x9 비트맵은 mdpi에서 12x12이고, hdpi에서 18x18, xhdpi에서 24x24 등, 이런 식으로 적용됩니다. 이미지 리소스가 텔레비전이나 특정 기기에서 제대로 보이지 않는다고 결정하고 tvdpi 리소스를 사용하려 할 경우, 배율은 1.33*mdpi입니다. 예를 들어, mdpi 화면의 100px x 100px 이미지는 tvdpi에서 133px x 133px가 되어야 합니다. 참고: 밀도 한정자를 사용하더라도 해당 리소스가 그 밀도의 화면 전용이라는 뜻은 아닙니다. 현재 기기 구성과 더욱 잘 맞는 한정자가 포함된 대체 리소스를 제공하지 않으면, 시스템이 가장 잘 일치하는 리소스를 사용합니다. 다양한 화질을 처리하는 방법과 Android가 현재 화질에 맞춰 비트맵을 축소하는 방법에 관한 자세한 정보는 다중 화면 지원을 참조하세요. |
터치스크린 유형 | notouch finger |
|
키보드 가용성 | keysexposed keyshidden keyssoft |
이것은 사용자가 하드웨어 키보드를 여는 경우 애플리케이션 수명 중에 변경될 수 있습니다. 이것이 런타임에 애플리케이션에 어떤 영향을 미치는지 알아보려면 런타임 변경 처리를 참조하세요. 또한, 구성 필드 |
기본 텍스트 입력 방법 | nokeys qwerty 12key |
구성 필드 |
탐색 키 가용성 | navexposed navhidden |
이것은 사용자가 탐색 키를 드러내는 경우 애플리케이션 수명 중에 변경될 수 있습니다. 이것이 런타임에 애플리케이션에 어떤 영향을 미치는지 알아보려면 런타임 변경 처리를 참조하세요. 구성 필드 |
기본 비터치 탐색 방법 | nonav dpad trackball wheel |
구성 필드 |
플랫폼 버전(API 레벨) | 예:v3 v4 v7 등 | 기기에서 지원하는 API 레벨입니다. 예를 들어, |
<테이블 출처 : https://developer.android.com/guide/topics/resources/providing-resources.html#ResourceTypes >
관련 내용이 너무 많아 안드로이드 개발자 오피셜 사이트에서 긁어 왔습니다 ^^;;
<qualifier>는 한번에 여러개를 사용할 수 있으며 대시로 구분하면 됩니다.
또한 이 값들의 순서는 위 표의 상단부터 하단으로 추가 하면 됩니다.
drawable-hdpi-port/ 잘못된 표기
drawable-port-hdpi/ 맞는 표기
port 값이 hdpi 보다 상위에 있는 qualifier 입니다.
그럼 리소스 구조에 위와 같은 방식으로 대체 리소스를 추가(붉은 색이 대체 리소스 디렉토리) 한 예를 보여 드리겠습니다.
res/
color/
drawable/
drawable-hdpi/
drawable-mdpi/
drawable-xhdpi/
drawable-xxhdpi/
mipmap/
layout/
value/
value-en/
value-ko/
value-w820dp/
지금까지 Android Resources 에 대해 알아 봤습니다.
개념적인 부분만 정리를 했는데요, 다음에는 샘플 코드를 참조 하여 어떤식으로 사용하는지 알아 보겠습니다.
'Android (Java)' 카테고리의 다른 글
[안드로이드 코딩_013] 안드로이드 해상도와 DP, DPI (489) | 2017.08.26 |
---|---|
[안드로이드 코딩_012]안드로이드 리소스 (Android Resources) 2회 (492) | 2017.08.25 |
안드로이드 단말정보 가져오기 (474) | 2017.08.13 |
[안드로이드 코딩_010] 안드로이드 인텐트와 인테트 필터 (2회) (486) | 2017.08.09 |
Android NetworkOnMainThreadException 과 해결방안 (501) | 2017.08.05 |