본문 바로가기

프로그래밍/안드로이드

[안드로이드/Android] 안드로이드 - 리소스 (1)

[안드로이드] 안드로이드 - 리소스 (1)


리소스 1   ☜ 현재 보는 곳

리소스(Resource)는 안드로이드 아키텍처에서 중요한 역활을 담당한다.

안드로이드 리소스란 실행 가능 애플리케이션에 연결돼 있는 파일(ex : mp3)이나 값(ex : 대화창 제목)을 의미한다. 이러한 파일과 값들은 애플리케이션을 다시 컴파일 해서 디플로이(deploy)하지 않고도 변경할 수 있게끔 실행파일에 연결된다. 리소스는 보편화된 각종 UI프레임워크에서 매우 중요한 역활을 담당한다.

리소스에 대한 보편적 예제들 중에는 문자열, 컬러, 비트맵 예제도 있다. 일례로 애플리케이션에서 문자열을 하드코딩하지 않고 그 문자열들의 ID를 이용할 수도 있다. 이러한 간접적 방법을 사용하면 개발자는 소스코드를 수정하지 않고도 문자열 리소스의 문구를 변경할 수 있다.


문자열 리소스

문자열 리소스 정의가 들어 있는 XML 파일들은 /res/values 디렉토리에 들어 있다. XML 파일들의 이름은 임의적이며, 그중에서 주로 살펴볼 파일은 strings.xml이다.  아래에 샘플 파일이 있다.

Ex) strings.xml 샘플 파일

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <string name="hello">hello</string>
     <string name="app_name">hello 애플리케이션 이름</string>
</resources>

이 파일이 생성되거나 업데이트 되면 이클립스 ADT플러그인은 애플리케이션의 루트 패키지안에 기입돼 있는 두 개의 문자열 리소스에 고유 ID를 부여하여 R.java 라는 이름의 자바 클래스를 자동으로 생성/업데이트 한다.

R.java 파일은 gen폴더 안에 프로젝트 생성시 설정한 패키지 안에 들어 있다.
tip)리소스 파일수에 상관없이 R.java파일은 단 한 개만 존재한다.


대부분의 샘플 애플리케이션이 한 개의 strings.xml 파일 안에 모든 문자열을 정의하고 있는데, 이것은 그저 관례에 불과하다. XML 파일의 구조가 위와 같고 그 XML파일이 /res/values 디렉터리에 있다는 전제하에, 안드로이드에 추가할 수 있는 임의 파일의 수에는 제한이 없다.

이 XML 파일의 구조는 따라하기 쉽다. 루트 노드<resources>를 작성한 후 하나 이상의 자식 요소<string>을 작성하면 된다. 각<string>요소나 노드에는 name속성이 존재하는데, 이 속성은 R.java에서 id 특성으로 끝나게 된다.

◈ 레이아웃 리소스

레이아웃 리소스는 안드로이드 UI프로그래밍에 사용되는 필수적인 핵심 리소스다. 안드로이드에서 화면의 뷰는 XML 파일로부터 로딩 되는 경우가 많다. 이 XML 파일들을 레이아웃 리소스(layout resource)라고 한다.

Ex) HelloWorldActivity.java 샘플 파일

import android.app.Activity;

import android.os.Bundle; 
import android.widget.TextView; 

public class HelloWorldActivity extends Activity{ 

public static void onCreate(Bundle icicle) {
super.onCreate(icicle); 
setContentView(R.layout.main);
}

}


setContentView(R.layout.main) 행을 보면 R.layout이라는 static 클래스가 존재하며, 그 클래스 안에는 main(정수)이라는 XML 레이아웃 리소스 파일에 정의돼 있는 View를 참조하는 상수가 존재함을 알 수 있다. XML파일명은 main.xml이 되겠고, 이 파일은 리소스의 layout 디렉토리에 들어가야 한다. 즉, 이 명령은 프로그래머가 /res/layout/main.xml 파일을 생성하고 그 파일 안에 필요한 레이아웃 정의를 넣어야 함을 암시 한다. main.xml 레이아웃 파일의 내용은 아래와 같다.


Ex) main.xml 샘플 파일

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
>
<TextView
             android:id="@+id/test1"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/hello"
/>
<Button
 android:id="@+id/b1"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/hello"
/>
</LinearLayout>
 
위의 LinearLayout이라는 루트 노드가 정의돼 있으며, 그 안에는 TextView와 Button이 차례로 들어 있다. 이 예제에서 LinearLayout은 하위 자식들을 세로나 가로로 레이아웃한다.

각 화면마다 별도의 레이아웃 파일을 정의해야 한다. 만약 개발자가 두 화면을 그리려 한다면 /res/layout/screen1.xml, /res/layout/screen2.xml 와 같이 두개의 레이아웃 파일이 필요하다.

Tip) /res/layout/ 디렉토리 안의 각 파일은 확장자를 포함한 파일명을 토대로 고유 상수를 자동 생성한다. 레이아웃 리소스에서 중요한 것은 파일의 개수이며, 문자열 리소스에서 중요한 것은 그 파일들 안의 문자열 리소스 개수다.

id 특성의 특성 값을 보면, 그 액티비티 내의 여러 뷰 중에서 이 뷰를 고유하게 식별하는 데에 상수 text1이 사용도리 것임을 알 수 있다. @+id/text1에서 플러스 기호(+)는 text1이라는 ID가 존재하지 않을 경우 그 ID가 생성도리 것임을 의미한다.

◈ 리소스 참조 문법

리소스 종류에 상관없이 모든 안드로이드 리소스는 자바 소스 코드안에서 각각의 id를 통해 식별/참조된다.  XML 파일 안에서 리소스에 id를 할당하는 데 사용하는 문법을 리소스 참조문법(resource-reference syntax) 라고 한다. 앞의 @+id/text1 예에서 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      현재 보는 곳

덧글]

개발하시다가 온몸이 찌뿌둥하시면 아래 동영상을 따라 스트레칭을 한번하세요.


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