page.title=리소스 액세스 parent.title=애플리케이션 리소스 parent.link=index.html @jd:body

간략히 보기

Key 클래스

  1. {@link android.content.res.Resources}

이 문서의 내용

  1. 코드에서 리소스 액세스
  2. XML에서 리소스 액세스
    1. 스타일 속성 참조
  3. 플랫폼 리소스 액세스

참고 항목

  1. 리소스 제공
  2. 리소스 유형

일단 어떤 리소스를 애플리케이션에 제공한 다음에는(리소스 제공에서 논의), 해당 리소스의 리소스 ID를 참조함으로써 이를 적용할 수 있습니다. 모든 리소스 ID는 {@code aapt} 도구가 자동으로 생성하는 프로젝트의 {@code R} 클래스에서 정의됩니다.

애플리케이션이 컴파일링되면, {@code aapt}가 {@code R} 클래스를 생성하며, 이 클래스 안에 {@code res/} 디렉터리에 있는 모든 리소스의 리소스 ID가 들어있습니다. 각 리소스 유형에는 {@code R} 하위 클래스가 있고(예: 모든 드로어블 리소스에 대한 {@code R.drawable}), 해당 유형의 각 리소스에는 정적 정수가 있습니다(예: {@code R.drawable.icon}). 이 정수가 리소스를 검색하는 데 사용할 수 있는 리소스 ID입니다.

{@code R} 클래스가 리소스 ID가 지정되는 곳이기는 하지만, 리소스 ID를 찾기 위해 이곳을 볼 필요는 전혀 없습니다. 하나의 리소스 ID는 항상 다음과 같이 구성됩니다.

리소스에 액세스하는 방법은 두 가지가 있습니다.

코드 내 리소스 액세스

리소스 ID를 메서드 매개변수로 전달하면 코드 내 리소스를 사용할 수 있습니다. 예를 들어 , {@link android.widget.ImageView}를 설정하여 {@link android.widget.ImageView#setImageResource(int) setImageResource()}를 사용하는 {@code res/drawable/myimage.png} 리소스를 사용할 수 있습니다.

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

{@link android.content.res.Resources}에서 메서드를 사용하는 개별 리소스를 검색할 수도 있으며, 이는 {@link android.content.Context#getResources()}로 인스턴스를 가져올 수 있습니다.

구문

다음은 코드로 리소스를 참조하는 데 쓰는 구문입니다.

[<package_name>.]R.<resource_type>.<resource_name>

각 리소스 유형과 참조 방법에 관한 자세한 내용은 리소스 유형 을 참조하십시오.

사용 사례

리소스 ID 매개변수를 허용하는 메서드가 많이 있고, {@link android.content.res.Resources}에서 메서드를 사용하여 리소스를 검색할 수 있습니다. {@link android.content.Context#getResources Context.getResources()}로 {@link android.content.res.Resources}의 인스턴스를 가져올 수 있습니다.

다음은 코드로 리소스에 액세스한 몇 가지 예시입니다.

// Load a background for the current screen from a drawable resource
{@link android.app.Activity#getWindow()}.{@link
android.view.Window#setBackgroundDrawableResource(int)
setBackgroundDrawableResource}(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID
{@link android.app.Activity#getWindow()}.{@link android.view.Window#setTitle(CharSequence)
setTitle}(getResources().{@link android.content.res.Resources#getText(int)
getText}(R.string.main_title));

// Load a custom layout for the current screen
{@link android.app.Activity#setContentView(int)
setContentView}(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.{@link android.widget.ViewAnimator#setInAnimation(Animation)
setInAnimation}(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.{@link android.widget.TextView#setText(int)
setText}(R.string.hello_message);

주의: 손으로 {@code R.java} 파일을 수정해서는 안 됩니다.—이것은 프로젝트가 컴파일되었을 때 {@code aapt} 도구가 생성한 파일입니다. 모든 변경 사항은 다음 번 컴파일에서 재정의됩니다.

XML에서 리소스 액세스

기존 리소스에 대한 참조를 사용하여 일부 XML 속성과 요소의 값을 정의할 수 있습니다. 이 작업은 레이아웃 파일을 생성할 때 위젯에 문자열과 이미지를 제공하기 위해 자주 하게 됩니다.

예를 들어, 레이아웃에 {@link android.widget.Button}을 추가하면 해당 버튼 텍스트에 문자열 리소스를 사용해야 합니다.

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

구문

다음은 XML 리소스로 리소스를 참조하는 데 쓰는 구문입니다.

@[<package_name>:]<resource_type>/<resource_name>

각 리소스 유형과 참조 방법에 관한 자세한 내용은 리소스 유형 을 참조하십시오.

사용 사례

몇몇 경우에는 값에 대한 리소스를 반드시 XML로 사용해야 하지만(예: 위젯에 드로어블 이미지를 적용하기 위해), 단순 값을 허용하는 곳이라면 어디서든 XML로 리소스를 사용할 수도 있습니다. 예를 들어 , 색상 리소스문자열 리소스를 포함한 다음과 같은 리소스 파일을 가지고 있다고 합시다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

텍스트 색상과 텍스트 문자열을 설정하는 데 이와 같은 리소스를 다음의 레이아웃 파일에서 사용할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

이 경우, 리소스를 자체 패키지에서 가져왔으므로 리소스 참조에 패키지 이름을 지정하지 않아도 됩니다. 시스템 리소스를 참조하려면 패키지 이름을 포함해야 합니다. 예:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@android:color/secondary_text_dark"
    android:text="@string/hello" />

참고: 항상 문자열 리소스를 사용해야 사용자의 애플리케이션이 다른 언어에 맞게 지역화될 수 있습니다. 대체 리소스(예: 지역화된 문자열) 생성에 관한 자세한 정보는 대체 리소스 제공을 참조하십시오. 다른 언어로 애플리케이션을 지역화하기 위한 전체 지침은 지역화를 참조하십시오.

XML의 리소스를 사용하여 별명을 생성할 수도 있습니다. 예를 들어, 드로어블 리소스이면서 또 다른 드로어블 리소스의 별명인 것을 생성할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

이것은 일견 중복되는 것처럼 들리지만, 대체 리소스를 사용할 때 매우 유용하게 쓰일 수 있습니다. 별명 리소스 생성에 관해 자세히 알아보십시오.

스타일 속성 참조

스타일 속성 리소스는 현재 적용된 테마의 속성 값을 참조할 수 있게 해줍니다. 스타일 속성을 참조하면 하드 코드로 작성된 값을 제공하는 것 대신에 UI 요소의 외관을 사용자 지정하여 현재 테마에서 제공한 표준 변형에 맞춰 스타일링할 수 있습니다. 스타일 속성을 참조하는 것은 기본적으로 "이 속성이 정의한 스타일을 현재 테마로 사용하라"는 말과 같습니다.

스타일 속성을 참조하는 경우, 이름 구문은 보통 리소스와 거의 똑같습니다. 다만 앳 기호({@code @})를 사용하는 대신 물음표({@code ?})를 사용하며, 리소스 유형 부분이 선택 사항이라는 점만이 다릅니다. 예:

?[<package_name>:][<resource_type>/]<resource_name>

예컨대 다음은 텍스트 색상을 시스템 테마의 "기본" 텍스트 색상에 일치하도록 설정하기 위해 속성을 참조하는 방법을 나타낸 것입니다.

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

여기서 {@code android:textColor} 속성이 주어진 스타일 속성의 이름을 현재 테마대로 지정합니다. Android는 이제 {@code android:textColorSecondary} 스타일 속성에 적용된 값을 이 위젯의 {@code android:textColor}에 대한 값으로 사용합니다. 시스템 리소스 도구는 속성 리소스가 이 컨텍스트에서 예상된다는 것을 알기 때문에 유형( ?android:attr/textColorSecondary)을 명시적으로 선언하지 않아도 됩니다.—{@code attr} 유형은 배제해도 됩니다.

플랫폼 리소스 액세스

Android에는 스타일, 테마 및 레이아웃 등 여러 가지 표준 리소스가 포함되어 있습니다. 이와 같은 리소스에 액세스하려면 android 패키지 이름으로 리소스 참조를 한정합니다. 예를 들어 Android는 {@link android.widget.ListAdapter}의 목록 항목으로 사용할 수 있는 레이아웃 리소스를 제공합니다.

{@link android.app.ListActivity#setListAdapter(ListAdapter)
setListAdapter}(new {@link
android.widget.ArrayAdapter}<String>(this, android.R.layout.simple_list_item_1, myarray));

이 예시에서 {@link android.R.layout#simple_list_item_1}은 {@link android.widget.ListView}의 항목에 대해 플랫폼이 정의한 레이아웃 리소스입니다. 목록 항목에 대해 나름의 레이아웃을 만드는 대신 이것을 사용해도 됩니다. 자세한 내용은 목록 보기 개발자 가이드를 참조하십시오.