안드로이드 리소스란 실행 가능 애플리케이션에 연결돼 있는 파일(ex : mp3)이나 값(ex : 대화창 제목)을 의미한다. 이러한 파일과 값들은 애플리케이션을 다시 컴파일 해서 디플로이(deploy)하지 않고도 변경할 수 있게끔 실행파일에 연결된다. 리소스는 보편화된 각종 UI프레임워크에서 매우 중요한 역활을 담당한다.
리소스에 대한 보편적 예제들 중에는 문자열, 컬러, 비트맵 예제도 있다. 일례로 애플리케이션에서 문자열을 하드코딩하지 않고 그 문자열들의 ID를 이용할 수도 있다. 이러한 간접적 방법을 사용하면 개발자는 소스코드를 수정하지 않고도 문자열 리소스의 문구를 변경할 수 있다.
◈ 문자열 리소스
Ex) strings.xml 샘플 파일
<string name="hello">hello</string>
<string name="app_name">hello 애플리케이션 이름</string>
</resources>
이 파일이 생성되거나 업데이트 되면 이클립스 ADT플러그인은 애플리케이션의 루트 패키지안에 기입돼 있는 두 개의 문자열 리소스에 고유 ID를 부여하여 R.java 라는 이름의 자바 클래스를 자동으로 생성/업데이트 한다.
R.java 파일은 gen폴더 안에 프로젝트 생성시 설정한 패키지 안에 들어 있다.
대부분의 샘플 애플리케이션이 한 개의 strings.xml 파일 안에 모든 문자열을 정의하고 있는데, 이것은 그저 관례에 불과하다. XML 파일의 구조가 위와 같고 그 XML파일이 /res/values 디렉터리에 있다는 전제하에, 안드로이드에 추가할 수 있는 임의 파일의 수에는 제한이 없다.
이 XML 파일의 구조는 따라하기 쉽다. 루트 노드<resources>를 작성한 후 하나 이상의 자식 요소<string>을 작성하면 된다. 각<string>요소나 노드에는 name속성이 존재하는데, 이 속성은 R.java에서 id 특성으로 끝나게 된다.
◈ 레이아웃 리소스
레이아웃 리소스는 안드로이드 UI프로그래밍에 사용되는 필수적인 핵심 리소스다. 안드로이드에서 화면의 뷰는 XML 파일로부터 로딩 되는 경우가 많다. 이 XML 파일들을 레이아웃 리소스(layout resource)라고 한다.
Ex) HelloWorldActivity.java 샘플 파일
import android.os.Bundle;
import android.widget.TextView;
public class HelloWorldActivity extends Activity{
}
Ex) main.xml 샘플 파일
<TextView
android:id="@+id/test1"
<Button
</LinearLayout>
위의 LinearLayout이라는 루트 노드가 정의돼 있으며, 그 안에는 TextView와 Button이 차례로 들어 있다. 이 예제에서 LinearLayout은 하위 자식들을 세로나 가로로 레이아웃한다.
각 화면마다 별도의 레이아웃 파일을 정의해야 한다. 만약 개발자가 두 화면을 그리려 한다면 /res/layout/screen1.xml, /res/layout/screen2.xml 와 같이 두개의 레이아웃 파일이 필요하다.
Tip) /res/layout/ 디렉토리 안의 각 파일은 확장자를 포함한 파일명을 토대로 고유 상수를 자동 생성한다. 레이아웃 리소스에서 중요한 것은 파일의 개수이며, 문자열 리소스에서 중요한 것은 그 파일들 안의 문자열 리소스 개수다.
id 특성의 특성 값을 보면, 그 액티비티 내의 여러 뷰 중에서 이 뷰를 고유하게 식별하는 데에 상수 text1이 사용도리 것임을 알 수 있다. @+id/text1에서 플러스 기호(+)는 text1이라는 ID가 존재하지 않을 경우 그 ID가 생성도리 것임을 의미한다.
◈ 리소스 참조 문법
@[package:]type/name
type은 R.java에서 사용할 수 있는 아래의 리소스 종류 이름공간 중 하나에 대응된다.
R.drawable
R.id
R.layout
R.string
R.attr
이를 대응 되는 XML 리소스 참조 문법으로 표기하면 다음과 같다.
drawable
id
layout
string
attr
리스소 참조 @[package:]type/name 에서 name 부분은 해당 리소스에 부여된 이름이며, 이것은 R.java안에 int 상수로도 표현된다.
만일 @[package:]type/name 문법에서 아무런 'package'도 지정하지 않으면, type/name 쌍이 로컬 리소스들과 애플리케이션의 로컬 R.java 패키지를 토대로 해독된다.
만일 android:type/name을 지정하면, 참조 ID는 패키지 android를 이용하여 해독되며 구체적으로는 android.R.java 파일을 통해 해독된다. 참조를 해독할 알맞은 R.java 파일 위치를 지정하기 위해 package 자리에 자바 패키지명을 대신 사용할 수 있다.
<TextView android:id="text">
id에 미가공 텍스트 문자열이 지정되지 않아 컴파일 에러 발생
<TextView android:id="@text">
잘못된 문법이다. 리소스 종류 이름을 지정하지 않았으므로 "No Resource type specified" 에러 발생
<TextView android:id="@id/text">
에러 : id가 text인 리소스가 존재하지 않음
미리 text를 ID로 정의하게끔 처리하지 않았을 경우
<TextView android:id="@android:id/text">
에러 : 리소스가 public이 아님.
android.R.id에 그런 di가 존재하지 않음을 의미함
물론 이것은 안드로이드 R.java에 이이름으로 id를 정의하면 유효해진다.
<TextView android:id="@+id/text">
성공 : 로컬 패키지의 R.java 안에 text라는 id를 생성.
덧글]
개발하시다가 온몸이 찌뿌둥하시면 아래 동영상을 따라 스트레칭을 한번하세요.
1. 목디스크 예방을 위한 목운동 ☞ http://jwandroid.tistory.com/192
2. 손목터널증후군 손목스트레칭으로 예방합시다. ☞ http://jwandroid.tistory.com/193
3. 개발자 여러분 허리를 세우세요 - 척추체조 1번 ☞ http://jwandroid.tistory.com/194
4. 개발자 여러분 허리를 세우세요 - 척추체조 2번 ☞ http://jwandroid.tistory.com/195
5. 개발자 여러분 허리를 세우세요 - 척추체조 3번 ☞ http://jwandroid.tistory.com/196
6. 개발자 여러분 허리를 세우세요 - 척추체조 4번 ☞ http://jwandroid.tistory.com/197
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[안드로이드] 안드로이드 Failed to install timeout (1) | 2012.05.08 |
---|---|
[안드로이드/Android] 안드로이드 ViewGroup (0) | 2012.05.07 |
[안드로이드/Android] 안드로이드 View (0) | 2012.05.07 |
[안드로이드/Android] 안드로이드 인텐트 - 2 (0) | 2012.05.07 |
[안드로이드] 안드로이드 - 리소스 (2) (0) | 2012.05.07 |
[안드로이드/Android] 안드로이드 권한(Permission) 종류 (3) | 2012.05.04 |
[안드로이드/Android] 안드로이드 전화 수신 이벤트 체크하기 (1) | 2012.05.04 |
[번역] 안드로이드 Android and Security (0) | 2012.05.03 |
[링크 스크랩] [번역] 안드로이드 Android Security Overview (0) | 2012.05.03 |