The Android Developer Challenge is back! Submit your idea before December 2.

리소스 액세스

일단 어떤 리소스를 애플리케이션에 제공한 다음에는(리소스 제공에서 논의), 해당 리소스의 리소스 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의 항목에 대해 플랫폼이 정의한 레이아웃 리소스입니다. 목록 항목에 대해 나름의 레이아웃을 만드는 대신 이것을 사용해도 됩니다. 자세한 내용은 목록 뷰 개발자 가이드를 참조하세요.