앱에서 이용하는 리소스는 크게 앱 리소스와 플랫폼 리소스로 구분된다.
앱 리소스는 개발자가 직접 추가한 리소스를 의미하며, 주로 res
폴더 아래에 위치한다. 이 리소스들은 앱의 UI 구성과 기능 구현에 중요한 역할을 한다.
values: 재사용 가능한 값들을 모아두는 폴더로, 다양한 XML 파일이 포함된다. 예를 들어:
strings.xml
: 앱에서 사용하는 문자열을 정의한다. 다국어 지원을 위해 사용된다.colors.xml
: 앱에서 사용할 색상을 정의한다. 색상 코드를 지정해 재사용하기 편리하다.styles.xml
: 앱의 테마와 스타일을 정의한다.font: 커스텀 글꼴 파일을 저장하는 폴더다.
color: 앱에서 사용할 색상을 정의하는 폴더다. colors.xml
파일을 통해 색상 코드들을 지정하고 이름을 붙여, UI 구성에서 쉽게 참조할 수 있다.
플랫폼 리소스는 안드로이드 운영체제에서 기본적으로 제공하는 리소스를 의미한다. 예를 들어, 안드로이드의 기본 스타일, 색상, 아이콘 등이 포함되며, android.R
패키지를 통해 참조할 수 있다. 이러한 리소스는 앱 전반에서 일관된 디자인을 유지하거나 시스템의 기본 동작을 사용할 때 유용하다.
project -> packages -> libraries에서 원하는 앱 리소스를 사용할 수 있다.
플랫폼 리소스도 R 파일에 등록된 식별자로 사용할 수 있다.
그런데 플랫폼 리소스는 앱에 있는 리소스가 아니므로 앱의 R 파일이 아니라, android.R이라는 플랫폼 라이브러리의 R파일에 등록되어 있다.
따라서 android.R 파일을 이용해 플랫폼 리소스를 이용할 수 있다.
안드로이드에서 리소스 조건 설정이란, 다양한 기기나 상황에 맞게 리소스를 동적으로 선택하고 제공하기 위해 리소스의 조건(qualifiers)을 설정하는 것을 의미한다. 이러한 조건을 통해 화면 크기, 해상도, 언어, API 레벨 등에 따라 다른 리소스를 사용할 수 있다.
조건 설정은 res
폴더 하위의 서브 디렉토리에 조건(qualifiers)을 붙여 특정 환경에서만 사용할 리소스를 지정하는 방식이다.
예를 들어, 기기의 언어가 영어일 때와 한국어일 때 다른 문자열 리소스를 제공하거나, 화면 크기에 따라 다른 레이아웃을 적용하는 등의 작업이 가능하다.
조건 설정 (Qualifier) | 설명 | 예시 |
---|---|---|
화면 크기 (Screen Size) | 기기의 화면 크기에 따라 리소스를 분기 | res/layout-sw600dp/ |
화면 밀도 (Screen Density) | 기기의 해상도나 픽셀 밀도에 따라 이미지를 분기 | res/drawable-xhdpi/ |
화면 방향 (Screen Orientation) | 화면이 가로 또는 세로일 때 다른 레이아웃을 사용하도록 분기 | res/layout-land/ |
언어 및 지역 (Language and Region) | 언어 및 국가 설정에 따라 문자열 리소스를 분기 | res/values-ko/ , res/values-en/ |
API 레벨 (API Level) | 특정 API 레벨 이상에서만 적용되는 리소스를 지정 | res/values-v21/ |
나이트 모드 (Night Mode) | 다크 모드와 라이트 모드에 따라 다른 리소스를 제공 | res/values-night/ |
최소 너비 (Smallest Width) | 기기의 최소 너비(dp)에 따라 레이아웃을 분기 | res/layout-sw720dp/ |
화면 크기에 따라 서로 다른 레이아웃을 제공하고 싶다면 다음과 같이 설정한다.
res/layout/activity_main.xml
: 기본 레이아웃res/layout-sw600dp/activity_main.xml
: 너비가 600dp 이상인 기기에서 사용할 레이아웃앱이 다국어를 지원할 경우 언어에 따라 문자열을 다르게 설정할 수 있다:
res/values/strings.xml
: 기본 언어(영어) 문자열res/values-ko/strings.xml
: 한국어로 된 문자열해상도나 화면 밀도에 따라 이미지 리소스를 분리하여 관리할 수 있다:
res/drawable-mdpi/
: 중간 해상도 이미지res/drawable-xhdpi/
: 고해상도 이미지안드로이드 시스템은 리소스를 선택할 때 가장 구체적인 조건을 가진 리소스를 우선적으로 선택한다. 예를 들어, 기기가 sw600dp
와 land
조건을 모두 만족할 경우, layout-sw600dp-land
폴더의 리소스를 사용한다.
리소스 조건을 이용해 화면 회전에 대응하는 UI를 만들 수 있다.
스마트폰은 어떤 화면이 세로 방향일 때는 어울리는데 가로 방향으로 회전하면 부적절해서 가로 방향에 알맞은 화면을 따로 제공해야 할 수 있다.
이처럼 화면 회전에 대응하려면 가로와 세로 방향일 때 출력할 레이아웃 XML 파일을 각각 준비해야 한다.
이 코드는 안드로이드 앱에서 화면 회전에 따라 다르게 표시되는 레이아웃을 설정하는 방법을 보여준다. 세로 화면과 가로 화면에서 각각 다른 레이아웃을 사용하는 방법에 대해 설명한다.
<?xml version="1.0" encoding="utf-8"?>
<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/dbr" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:src="@drawable/ct2" />
</LinearLayout>
설명: wrap_content는 뷰의 너비를 콘텐츠의 크기에 맞게 조정한다. 예를 들어, ImageView의 경우, 이미지의 실제 크기에 따라 너비가 설정된다.
용도: 뷰가 자신의 콘텐츠에 맞는 크기로 표시되게 하려는 경우에 사용한다. 예를 들어, 이미지를 정확한 크기로 표시하거나 텍스트의 길이에 맞게 너비를 조정할 때 사용한다.
설명: 0dp는 기본적으로 뷰의 높이를 layout_weight에 따라 계산하게 한다. 0dp는 가중치 기반 레이아웃에서 뷰의 실제 높이를 무시하고, 가중치 값에 따라 높이를 설정한다.
용도: 뷰의 높이를 다른 뷰와의 비율에 따라 조정하고 싶을 때 사용한다. 예를 들어, 여러 ImageView가 같은 공간을 균등하게 나누도록 하고 싶을 때 사용된다.
설명: layout_weight는 LinearLayout의 남은 공간을 자식 뷰들 간에 비율적으로 나누는 역할을 한다. 값이 클수록 더 많은 공간을 차지하게 된다. 예를 들어, 두 뷰가 layout_weight="1"로 설정되어 있으면, 두 뷰가 남은 공간을 동일하게 나누게 된다.
용도: 화면 공간을 여러 뷰 간에 균등하게 나누고 싶을 때 사용된다. 가중치를 사용하면 유동적으로 공간을 배분할 수 있다.
이 레이아웃은 세로 화면에서 두 개의 이미지가 화면 전체를 채우도록 배치한다.
(1+1=2이고, 1/2를 차지)
<?xml version="1.0" encoding="utf-8"?>
<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/dbr" />
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/ct2" />
</LinearLayout>
Layout Folder: 이 파일은 res/layout-land/
폴더에 위치해야 한다. layout-land
폴더는 가로 방향 화면에서 사용할 레이아웃을 정의한다.
LinearLayout: LinearLayout
의 orientation
속성이 horizontal
로 설정되어 있어, 자식 뷰들이 수평으로 배치된다.
ImageView: 두 개의 ImageView
가 포함되어 있으며, 각각 layout_width
는 0dp
, layout_height
는 wrap_content
로 설정되어 있다. layout_weight="1"
을 통해 두 이미지가 동일한 비율로 화면을 차지한다.
layout_width="0dp"
: 너비는 가중치에 의해 결정된다.layout_height="wrap_content"
: 높이는 콘텐츠에 맞게 조정된다.layout_weight="1"
: 남은 공간을 동일하게 나눈다. 이 레이아웃은 가로 화면에서 두 개의 이미지가 화면 전체를 차지하도록 배치한다.
res/layout/
): 이미지가 수직으로 배치되며, 각각의 높이는 가중치에 따라 설정된다.res/layout-land/
): 이미지가 수평으로 배치되며, 각각의 너비는 가중치에 따라 설정된다.안드로이드 앱을 개발할 때, 다양한 크기와 해상도의 디바이스에서 일관된 사용자 경험을 제공하기 위해 논리적인 단위를 사용하는 것이 중요하다. 이러한 단위들은 디바이스의 물리적인 픽셀 밀도와 상관없이 화면 요소의 크기와 위치를 일관되게 유지하는 데 도움을 준다.
안드로이드 기기들은 다양한 화면 크기와 해상도를 가지고 있다.
기기의 화면 크기는 일반적으로 인치 단위로 측정되며, 해상도는 화면의 픽셀 수를 나타낸다.
예를 들어, 스마트폰, 태블릿, 그리고 대형 화면을 가진 디바이스들은 모두 서로 다른 화면 크기와 해상도를 가진다.
화면 크기와 해상도:
픽셀 밀도 (DPI):
픽셀 밀도는 화면의 픽셀 밀도를 나타내며, 같은 크기의 물리적 화면에서 더 높은 DPI는 더 많은 픽셀을 의미한다.
가장 일반적으로 사용되는 단위:
dp (Density-independent Pixels):
sp (Scale-independent Pixels):
sp
단위로 설정된 텍스트 크기도 조정된다.android:textSize="16sp"
는 사용자의 글꼴 크기 설정을 고려하여 크기가 조정된다.pt (Points):
android:layout_width="10pt"
는 매우 특정한 물리적 크기를 설정한다.in (Inches):
android:layout_width="2in"
는 2인치 너비를 설정한다.mm (Millimeters):
android:layout_width="50mm"
는 50밀리미터 너비를 설정한다.