lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

리소스 액세스

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

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

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

  • 리소스 유형: 각 리소스는 '유형'으로 그룹화됩니다(예: string, drawable, and layout). 다양한 유형에 관한 자세한 정보는 리소스 유형을 참조하세요.
  • 리소스 이름: 리소스가 단순 값(예: 문자열 등)일 경우, 확장자를 제외한 파일 이름이나 XML android:name 특성 값 중 하나입니다.

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

  • 코드 내부에서: R 클래스의 서브클래스에서 정적 정수를 사용합니다. 예를 들면 다음과 같습니다.
    R.string.hello

    string은 리소스 유형이고 hello는 리소스 이름입니다. 리소스 ID를 이 형식으로 제공하면 리소스에 액세스할 수 있는 Android API가 많습니다. 코드 내 리소스 액세스를 참조하세요.

  • XML 내부에서: R 클래스에서 정의된 리소스 ID에 상응하기도 하는 특수 XML 구문을 사용합니다. 예를 들면 다음과 같습니다.
    @string/hello

    string은 리소스 유형이고 hello는 리소스 이름입니다. 이 구문은 리소스로 값을 제공할 것으로 예상되는 어느 곳에서나 XML 리소스 형태로 사용할 수 있습니다. XML에서 리소스 액세스를 참조하세요.

코드 내 리소스 액세스

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

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

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

구문

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

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name>은 리소스가 위치한 패키지의 이름입니다(자체 패키지의 리소스를 참조할 경우에는 필요하지 않음).
  • <resource_type>은 해당 리소스 유형의 R 서브클래스입니다.
  • <resource_name>은 확장자가 없는 리소스 파일 이름이거나 XML 요소의 android:name 특성 값입니다(단순 값의 경우).

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

사용 사례

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

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

// Load a background for the current screen from a drawable resource
getWindow().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
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.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.setText(R.string.hello_message);

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

XML에서 리소스 액세스

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

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

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

구문

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

@[<package_name>:]<resource_type>/<resource_name>
  • <package_name>은 리소스가 위치한 패키지의 이름입니다(같은 패키지의 리소스를 참조할 경우에는 필요하지 않음).
  • <resource_type>은 해당 리소스 유형의 R 서브클래스입니다.
  • <resource_name>은 확장자가 없는 리소스 파일 이름이거나 XML 요소의 android: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 요소의 외관을 사용자가 지정하여 현재 테마에서 제공한 표준 변형에 맞춰 스타일링할 수 있습니다. 스타일 특성을 참조하는 것은 기본적으로 "이 특성이 정의한 스타일을 현재 테마로 사용하라"는 말과 같습니다.

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

?[<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" />

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

플랫폼 리소스 액세스

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

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

이 예시에서 simple_list_item_1ListView의 항목에 대해 플랫폼이 정의한 레이아웃 리소스입니다. 목록 항목에 대해 나름의 레이아웃을 만드는 대신 이것을 사용해도 됩니다. 자세한 내용은 목록 뷰 개발자 가이드를 참조하세요.