다음을 통해 공유


대체 리소스

대체 리소스는 특정 디바이스 또는 런타임 구성(예: 현재 언어, 특정 화면 크기 또는 픽셀 밀도)을 대상으로 하는 리소스입니다. Android가 기본 리소스보다 특정 디바이스 또는 구성에 더 구체적인 리소스를 일치시킬 수 있는 경우 해당 리소스가 대신 사용됩니다. 현재 구성과 일치하는 대체 리소스를 찾지 못하면 기본 리소스가 로드됩니다. Android에서 애플리케이션에서 사용할 리소스를 결정하는 방법은 아래 리소스 위치 섹션에서 자세히 설명합니다.

대체 리소스는 기본 리소스와 마찬가지로 리소스 종류에 따라 리소스 폴더 내의 하위 디렉터리로 구성됩니다. 대체 리소스 하위 디렉터리의 이름은 ResourceType-한정자 형식입니다.

한정 자는 특정 디바이스 구성을 식별하는 이름입니다. 이름에 둘 이상의 한정자일 수 있으며 각 한정자는 대시로 구분됩니다. 예를 들어 아래 스크린샷은 로캘, 화면 밀도, 화면 크기 및 방향과 같은 다양한 구성에 대한 대체 리소스가 있는 간단한 프로젝트를 보여 줍니다.

리소스 종류에 한정자를 추가할 때 적용되는 규칙은 다음과 같습니다.

  1. 각 한정자를 대시로 구분하여 둘 이상의 한정자를 사용할 수 있습니다.

  2. 한정자는 한 번만 지정될 수 있습니다.

  3. 한정자는 아래 표에 표시되는 순서대로 되어 있어야 합니다.

참조를 위해 가능한 한정자는 다음과 같습니다.

  • MCC 및 MNCMCC(모바일 국가 코드 ) 및 선택적으로 MNC(모바일 네트워크 코드 )입니다. SIM 카드 MCC를 제공하고 디바이스가 연결된 네트워크는 MNC를 제공합니다. 모바일 국가 코드를 사용하여 로캘을 대상으로 지정할 수 있지만 아래에 지정된 언어 한정자를 사용하는 것이 좋습니다. 예를 들어 리소스를 독일로 대상으로 지정하려면 한정자는 다음과 같습니다 mcc262. 미국에서 T-Mobile에 대한 리소스를 대상으로 지정하려면 한정자는 .입니다 mcc310-mnc026. 모바일 국가 코드 및 모바일 네트워크 코드의 전체 목록은 다음을 참조 http://mcc-mnc.com/하세요.

  • 언어 – 두 글자 ISO 639-1 언어 코드 및 선택적으로 두 글자 ISO-3166-alpha-2 지역 코드 뒤에. 두 한정자를 모두 제공하면 해당 한정자는 .로 구분 -r됩니다. 예를 들어 프랑스어를 사용하는 로캘을 대상으로 지정하려면 한정 fr 자를 사용합니다. 프랑스-캐나다 로캘을 fr-rCA 대상으로 하기 위해 사용됩니다. 언어 코드 및 지역 코드의 전체 목록은 언어 이름 및 국가 이름 및 코드 요소의 표현에 대한 코드를 참조하세요.

  • 가장 작은 너비 – 애플리케이션이 실행하려는 가장 작은 화면 너비를 지정합니다. 다양한 화면에 대한 리소스 만들기에 대해 자세히 설명합니다. API 수준 13(Android 3.2) 이상에서 사용할 수 있습니다. 예를 들어 한정 sw320dp 자는 높이와 너비가 320dp 이상인 디바이스를 대상으로 지정하는 데 사용됩니다.

  • 사용 가능한 너비 – Ndp형식의 화면 최소 너비입니다. 여기서 N은 밀도 독립적 픽셀의 너비입니다. 이 값은 사용자가 디바이스를 회전할 때 변경됩니다. 다양한 화면에 대한 리소스 만들기에 대해 자세히 설명합니다. API 수준 13(Android 3.2) 이상에서 사용할 수 있습니다. 예: 한정자 w720dp는 너비가 720dp 이상인 디바이스를 대상으로 하는 데 사용됩니다.

  • 사용 가능한 높이 – hNdp 형식의 화면 최소 높이입니다. 여기서 N 은 dp의 높이입니다. 이 값은 사용자가 디바이스를 회전할 때 변경됩니다. 다양한 화면에 대한 리소스 만들기에 대해 자세히 설명합니다. API 수준 13(Android 3.2) 이상에서 사용할 수 있습니다. 예를 들어 한정자 h720dp는 높이가 720dp 이상인 디바이스를 대상으로 지정하는 데 사용됩니다.

  • 화면 크기 – 이 한정자는 이러한 리소스가 사용하는 화면 크기의 일반화입니다. 다양한 화면에 대한 리소스를 만드는 방법에 대해 자세히 설명 합니다. 가능한 값은 small, normal, largexlarge입니다. API 수준 9에 추가됨(Android 2.3/Android 2.3.1/Android 2.3.2)

  • 화면 측면 – 화면 방향이 아니라 가로 세로 비율을 기반으로 합니다. 긴 화면이 더 넓습니다. API 수준 4(Android 1.6)에 추가되었습니다. 가능한 값은 길고 길지 않습니다.

  • 화면 방향 – 세로 또는 가로 화면 방향입니다. 애플리케이션의 수명 동안 변경 될 수 있습니다. 가능한 값은 portland입니다.

  • 도크 모드 – 자동차 도크 또는 책상 도크에 있는 장치의 경우. API 수준 8(Android 2.2.x)에 추가되었습니다. 가능한 값은 cardesk입니다.

  • 야간 모드 – 애플리케이션이 야간 또는 낮에 실행되는지 여부입니다. 이는 애플리케이션의 수명 동안 변경되어 개발자가 밤에 더 어두운 버전의 인터페이스를 사용할 수 있는 기회를 제공하기 위한 것입니다. API 수준 8(Android 2.2.x)에 추가되었습니다. 가능한 값은 nightnotnight입니다.

  • 화면 픽셀 밀도(dpi) – 실제 화면에서 지정된 영역의 픽셀 수입니다. 일반적으로 dpi(인치당 점)로 표현됩니다. 가능한 값은 다음과 같습니다.

    • ldpi – 저밀도 화면.

    • mdpi – 중간 밀도 화면

    • hdpi – 고밀도 화면

    • xhdpi – 고밀도 추가 화면

    • nodpi – 크기를 조정할 수 없는 리소스

    • tvdpi – mdpi와 hdpi 사이의 화면용 API 수준 13(Android 3.2)에 도입되었습니다.

  • 터치 스크린 유형 – 디바이스에 있을 수 있는 터치 스크린의 유형을 지정합니다. 가능한 값은 notouch (터치 스크린 없음), stylus (스타일러스에 적합한 저항 터치 스크린) 및 finger (터치 스크린)입니다.

  • 키보드 가용성 – 사용할 수 있는 키보드 종류를 지정합니다. 예를 들어 사용자가 하드웨어 키보드를 여는 경우와 같이 애플리케이션의 수명 동안 변경 될 수 있습니다. 가능한 값은 다음과 같습니다.

    • keysexposed – 장치에 사용할 수 있는 키보드가 있습니다. 소프트웨어 키보드를 사용하도록 설정하지 않은 경우 하드웨어 키보드를 열 때만 사용됩니다.

    • keyshidden – 디바이스에 하드웨어 키보드가 있지만 숨겨져 있으며 소프트웨어 키보드를 사용할 수 없습니다.

    • keyssoft – 디바이스에 소프트웨어 키보드가 활성화되어 있습니다.

  • 기본 텍스트 입력 방법 – 입력에 사용할 수 있는 하드웨어 키 종류를 지정하는 데 사용합니다. 가능한 값은 다음과 같습니다.

    • nokeys – 입력할 하드웨어 키가 없습니다.

    • qwerty – 사용할 수 있는 쿼티 키보드가 있습니다.

    • 12key – 12 키 하드웨어 키보드가 있습니다.

  • 탐색 키 가용성 – 5방향 또는 d 패드(방향 패드) 탐색을 사용할 수 있는 경우 애플리케이션의 수명 동안 변경 될 수 있습니다. 가능한 값은 다음과 같습니다.

    • navexposed – 탐색 키를 사용자가 사용할 수 있습니다.

    • navhidden – 탐색 키를 사용할 수 없습니다.

  • 기본 비터치 탐색 방법 – 디바이스에서 사용할 수 있는 탐색의 종류입니다. 가능한 값은 다음과 같습니다.

    • nonav – 사용 가능한 유일한 탐색 기능은 터치 스크린입니다.

    • dpad – 탐색에 d 패드(directional-pad)를 사용할 수 있습니다.

    • trackball – 디바이스에 탐색용 트랙볼이 있습니다.

    • wheel – 하나 이상의 방향 휠을 사용할 수 있는 일반적이지 않은 시나리오

  • 플랫폼 버전(API 수준) – 디바이스에서 지원하는 API 수준은 vN 형식입니다. 여기서 N 은 대상으로 지정되는 API 수준입니다. 예를 들어 v11은 API 수준 11(Android 3.0) 디바이스를 대상으로 합니다.

리소스 한정자에 대한 자세한 내용은 Android 개발자 웹 사이트에서 리소스 제공을 참조하세요.

Android에서 사용할 리소스를 결정하는 방법

Android 애플리케이션에 많은 리소스가 포함될 가능성이 매우 높습니다. Android가 디바이스에서 실행될 때 애플리케이션에 대한 리소스를 선택하는 방법을 이해하는 것이 중요합니다.

Android는 다음 규칙 테스트를 반복하여 리소스 기반을 결정합니다.

  • 모순된 한정자를 제거합니다. 예를 들어 디바이스 방향이 세로인 경우 모든 가로 리소스 디렉터리는 거부됩니다.

  • 지원 되지 않는 한정자 무시 – 모든 API 수준에서 모든 한정자를 사용할 수 있는 것은 아닙니다. 리소스 디렉터리에 디바이스에서 지원되지 않는 한정자를 포함하는 경우 해당 리소스 디렉터리가 무시됩니다.

  • 다음으로 높은 우선 순위 한정 자를 식별합니다. 위의 테이블을 참조하여 다음으로 가장 높은 우선 순위 한정자(위에서 아래로)를 선택합니다.

  • 한정 자의 리소스 디렉터리를 유지합니다. 위의 표와 한정자를 일치시키는 리소스 디렉터리가 있는 경우 다음으로 가장 높은 우선 순위 한정자(위에서 아래로)를 선택합니다.

이러한 규칙은 다음 순서도에도 설명되어 있습니다.

Resources flowchart

시스템에서 밀도별 리소스를 찾고 찾을 수 없는 경우 다른 밀도 특정 리소스를 찾아 크기를 조정하려고 시도합니다. Android에서 반드시 기본 리소스를 사용하는 것은 아닙니다. 예를 들어 저밀도 리소스를 찾고 사용할 수 없는 경우 Android는 기본 또는 중간 밀도 리소스에 대해 고밀도 버전의 리소스를 선택할 수 있습니다. 이는 고밀도 리소스를 0.5배로 축소할 수 있기 때문에 0.75의 요소가 필요한 중간 밀도 리소스를 축소하는 것보다 가시성 문제가 적기 때문입니다.

예를 들어 다음과 같은 그리기 가능한 리소스 디렉터리를 포함하는 애플리케이션을 고려합니다.

drawable
drawable-en
drawable-fr-rCA
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
drawable-port-ldpi
drawable-port-notouch-12key

이제 애플리케이션이 다음 구성을 사용하여 디바이스에서 실행됩니다.

  • 로캘 – en-GB
  • 방향 – 포트
  • 화면 밀도 – hdpi
  • 터치 스크린 유형 – notouch
  • 기본 입력 메서드 – 12key

우선, 프랑스 리소스는 로캘 en-GB과 충돌하여 제거되어 다음을 남깁니다.

drawable
drawable-en
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
drawable-port-ldpi
drawable-port-notouch-12key

다음으로, 위의 한정자 테이블인 MCC 및 MNC에서 첫 번째 한정자를 선택합니다. MCC/MNC 코드가 무시되도록 이 한정자를 포함하는 리소스 디렉터리는 없습니다.

다음 한정자(언어)가 선택됩니다. 언어 코드와 일치하는 리소스가 있습니다. 언어 코드 en 와 일치하지 않는 모든 리소스 디렉터리에서 거부되므로 이제 리소스 목록이 다음과 같습니다.

drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi

다음 한정자는 화면 방향을 위한 것이므로 화면 방향과 일치하지 port 않는 모든 리소스 디렉터리를 제거합니다.

drawable-en-port
drawable-en-port-ldpi

다음은 화면 밀도 ldpi에 대한 한정자입니다. 그러면 하나 이상의 리소스 디렉터리가 제외됩니다.

drawable-en-port-ldpi

이 프로세스의 결과로 Android는 디바이스의 리소스 디렉터리 drawable-en-port-ldpi 에서 그리기 가능한 리소스를 사용합니다.

참고 항목

화면 크기 한정자는 이 선택 프로세스에 한 가지 예외를 제공합니다. Android는 현재 디바이스에서 제공하는 것보다 더 작은 화면용으로 설계된 리소스를 선택할 수 있습니다. 예를 들어 큰 화면 디바이스는 일반 크기의 화면에 제공하는 리소스를 사용할 수 있습니다. 그러나 반대의 경우도 마찬가지입니다. 동일한 대형 화면 디바이스는 xlarge 화면에 제공된 리소스를 사용하지 않습니다. Android에서 지정된 화면 크기와 일치하는 리소스 집합을 찾을 수 없는 경우 애플리케이션이 충돌합니다.