본문 바로가기
Kotlin

[Kotlin / Android] 09. 리소스 활용하기 - 리소스 조건 설정

by 쀼르쀼르 2024. 3. 14.

09-2 리소스 조건 설정


 

리소스 조건 설정이란?

 

어떤 리소스를 특정 환경에서만 적용되도록 설정하는 것

 

예를 들어 개발자가 실행 아이콘을 48×48px 크기로 준비했다고 가정

 

이 앱을 mdpi(medium dots per inch*) 기기에 설치하면 아이콘이 선명하게 보임

mdpi 기기는 실행 아이콘을 48×48px 크기로 출력하며

실제 아이콘도 48×48이므로 선명하게 나옴

*dpi는 기기의 화면 밀도, 즉 화면의 크기를 나타내는 단위임

 

그런데 똑같은 앱을hdpi(high dots per inch) 기기에 설치한다면

아이콘이 72×72 크기로 나옴

즉, 48×48 크기의 아이콘을 72×72 크기로 늘려서 출력하므로 선명하지 않음

 

아이콘이 선명하게 나오게 하려면

기기에 맞는 크기로 여러 장 준비해야 함

 

기기별 실행 아이콘 크기

화면 밀도 크기
XXXHDPI 192×192
XXHDPI 144×144
XHDPI 96×96
HDPI 72×72
MDPI 48×48

 

따라서 앱 개발할 때 아이콘이 선명하게 출력되도록

기기 크기별로 이미지를 5개씩 준비함

 

이미지를 어느 기기의 크기에 적용해야 하는지를 결정해야 함

이때 리소스 조건을 이용할 수 있음

즉, 리소스를 각 기기의 크기에 맞게 적용하는 작업을 코드에서 하지 않고

리소스 조건으로 지정하여 자동으로 환경에 맞게 적용하는 것

 

리소스 조건 이용하려면

아이콘의 파일명을 똑같이 지정해야 함

 

모두 ic_launcher.png라는 파일명으로 만들면 R 파일에는 식별자가 하나만 생성됨

→ 코드에서는 각 리소스 구분할 필요 없이 R.mipmap.ic_launcher라고 지정할 수 있음

 

but 파일명 중복되는 문제 발생

→ 디렉터리를 구분하여 해결함

    즉, 이름이 같은 파일을 하나의 디렉터리가 아니라

    mipmap-mdpi, mipmap-hdpi처럼 각각의 디렉터리에 담음

    이때 리소스 디렉터리 이름에서 붙임표(-) 뒤의 단어가 리소스의 조건임


리소스 조건

조건 예시 설명
MCC 및 MNC mcc310
mcc310-mcc004
이동통신 국가 코드(MCC)와 선택적으로 이동통신 네트워크 코드(MNC) 추가 가능. mcc310은 미국이며 mcc310-mnc004는 버라이즌을 이용하는 미국을 의미
언어 및 지역 en
ko-rKR
ISO639-1 언어 코드이며 선택적으로 뒤에 소문자 r을 추가해 ISO3166-1-alpha-2의 지역 코드가 나올 수 있음
레이아웃 방향 Idrtl
Idltr
히브리어처럼 오른쪽에서 왼쪽으로 쓰는 언어의 레이아웃에서 유용하게 이용 가능. Idrtl은 오른쪽에서 왼쪽, Idltr은 왼쪽에서 오른쪽 방향 레이아웃
더 작은 쪽 sw320dp 화면 크기 중 더 작은 쪽에 대한 조건. 화면 방향과 상관없이 화면의 높이와 너비 중 작은 쪽에 대한 조건을 의미. sw320dp이면 너비든 높이든 상관없이 작은 쪽의 치수가 320dp인 경우를 의미
이용 가능한 너비 w720dp 화면 너비에 대한 조건. w720dp이면 너비가 720인 기기
이용 가능한 높이  h720dp 화면 높이에 대한 조건. h720dp이면 높이가 720인 기기
화면 크기 small, normal, large, xlarge 화면 크기를 small, normal, large, xlarge로 판단해 조건 명시.
small은 320×428, normal은 320×470, large는 480×640, xlarge는 720×960 정도의 크기
화면 비율 long, notlong 화면의 종횡비 조건. long은 WQVGA, WVGA, FWVGA 등의 긴 화면, notlong은 QVGA, HVGA, VGA 등의 길지 않은 화면
원형 화면 round, notround 원형 화면인지 판단. round는 웨어러블 기기처럼 둥근 화면을 가지는 기기.
notround는 폰이나 태블릿처럼 사각형 화면의 기기 
화면 방향 port, land 화면의 방향에 대한 조건.
port는 세로 방향, land는 가로 방향
UI 모드 car, desk, television, application, watch, vrheadset 기기가 도크에 삽입되거나 제거될 때 대응을 위한 조건. car는 자동차, desk는 데스크, television은 TV, application은 표시되지 않은 제품
야간 모드 night, notnight 야간 모드에 대응하기 위한 조건.
night는 야간, notnight는 주간
화면 픽셀 밀도 Idpi, mdpi, hdpi,
xhdpi, xxhdpi,
xxxhdpi, nodpi, tvdpi,
anydpi, nnndpi
화면 밀도에 대한 조건.
Idpi는 120dpi, mdpi는 160dpi,
hdpi는 240dpi, xhdpi는 320dpi, xxhdpi는
480dpi, xxxdpi는 640dpi, nodpi는 크기를 조정하지 않을 리소스에 사용
터치 스크린 유형 notouch, finger 터치 스크린을 제공하는지 판단.
notouch는 터치 스크린이 없는 기기
키보드 가용성 keysexposed,
keyshidden, keyssoft
키보드의 유형.
keyssoft는 소프트 키보드, keysexposed는 키보드가 노출되어 있는 기기, keyshidden은 키도브가 있으나 숨길 수 있는 기기
기본 텍스트
입력방법
nokeys, qwerty, 12key nokeys는 하드웨어 키보드가 없는 경우, qwerty는 하드웨어 쿼티 키보드가 있는 경우, 12key는 하드웨어 12키가 있는 경우
탐색 키 가용성 navexposed, navhidden 탐색 키 사용 가능 조건. navexposed는 탐색 키 사용 가능, navhidden은 탐색 키 사용 불가
기본 비터치
탐색방법
nanav, dpad, trackball, wheel 터치하지 않고 탐색이 가능한 기기가 있는지 판단
플랫폼 버전 v21 기기의 API 레벨

 


화면 회전에 대응하기

스마트폰은 화면을 회전할 수 있는 기기이므로

방향에 따라 화면을 다르게 제공할 수 있음

 

화면 회전에 대응하려면 가로와 세로 방향일 때

출력할 레이아웃 XML파일을 각각 준비해야 함

but 어느 방향에서 어떤 XML 파일을 출력할지를 지정해야 함

 

· 세로 방향 레이아웃 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:src="@drawable/image1" />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:src="@drawable/image2" />
</LinearLayout>

 

· 가로 방향 레이아웃 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/image1" />
    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/image2" />
</LinearLayout>

국제 언어 제공하기

· 영어 문자열 리소스 예

<resources>
    <string name="app_name">Test9</string>
    <string name="intro">Hello</string>
</resources>

· 한국어 문자열 리소스 예

<resources>
    <string name="app_name">테스트9</string>
    <string name="intro">안녕하세요</string>
</resources>

 

문자열 리소스는 values 디렉터리의 리소스이므로

식별자는 파일명이 아니라 <string> 태그의 name 값임

따라서 각 파일에 문자열 등록할 때 name값은 똑같아야 함