2011년 2월16일

2011. 2. 16. 17:482010년/안드로이드

오늘은 안드로이드 SDK 세가지 핵심 요소인 resource, content provider,intent에서 대해서 알아보겠다.
사실 소스부터 보면서 이해하는것이 좋지만 이 3가지는 필수적으로 알고 있어야한다. 

resource 는  안드로이드 아키텍처에서 중요한 역할을 담당한다.  먼저 리소스가 선언적이라는 점과 자
바 프로그램 내 편리한 사용을 위해 안드로이드가 리소스 ID를 생성한다

리소스는 ID를 생성하는데 이 생성되는 방법과 사용하는 방법을 R.java에 있다.
그리고 XML파일에서의 리소스를 정의하는 방법
리소스를 다른 리소스 XML정의 안에 재사용 방법 자바프로그램안에서 재사용방법
XML기반의 리소스 이외에 미가공리소스 raw resource와 asset도 있다.


*******************************************
리소스 파일 수에 상관없이 R.java 파일은 단 한개만 존재한다.
*******************************************









문자열 리소스
하나 이상의 XML 리소스 파일안에 다수의 문자열을 정의할수있다.

XML 파일들은 /rea/values 디텍터리에 있다.
문자열 리소스는 그안에 strings.xml이다.


이 xml파일은 두문자열 리소스인 hello와 app_name은 고유ID를 부여하여 R.java라는 이름의 자바클래스를 자동으로 생성/업데이트한다.


R.java파일에서 문자열리소스가 고유 아이디로 생성되는 부분이다 뒤에 숫자는 주소값이다.
물론 컴파일이 이 ID가 고유한지 검사한후 R.java에 추가로 상수로 R.string.app_name과 R.string.hello로 들어가게된다.

이는 안드로이드의 컴파일과정에서 *.JAVA 와 *.XML이 클래스로 생성되어야한다. 하지만 XML은 그게 불가능하기때문에 ADT플로그인의 애플리케이션 루트패키지에 기입되어.. 고유ID로 R.java로 인해서 클래스가 생성이 되고 컴파일로 *.dex 파일이 생성된다.

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


res/layout 디렉터리 안에 main.xml 파일이 생성 하고 그안에 필요한 레이아웃을 정의한다.

루트 노드로 LinearLayout 이라고 정의되어있고 그안에 TextView와 Button이 정의되어잇다.  Layout의 종류는 앞장을 보고 다음에 다시 보겟다.
만약에 화면을 하나가 아닌 두개 이상일경우 당연히 layout에 들어가 XML는 두개 이상일것이다.
그에 대한정의는 역시 R.java에서 고유로 ID로 클래스가 생성된다
* 리소스 참조 문법
@[package:]type/name
type은 R.java에서 사용할수있고
R.drawable
R.id
R.layout
R.string
R.attr
이에 대응되는 XML 리소스 참조 문법으로 표기하면
drawable
id
layout
string
attr

패키지명을 [android:type/name]할경우 참조 ID는 패키지 android를 이용하여 해독하며
구체적으로는 android.R.java파일을 통해서 해독된다.
ex
<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에 그런 id가 존재하지 않음을 의미함
//물론 이것은 안드로이드 R.java에 이름으로
//id를 정의하면 유효해진다

<TextView android:id="@+id/text">
//성공:로컬 패키지의 R.java안에 text라는 id를 생성


컴파일 리소스와 미컴파일 리소스

대부눈의 리소스는 deploy되기 전에 바이너리 파일로 컴파일되지만 일부 리소스는 컴파일되지 않고 미가공 형태로 남아잇다.
주로 XML과 미가공파일(이미지,오디오,비디오) 이두종류의 파일을 통해 리소스를 지원한다.

미가공파일등은 /res/raw/디렉터리에 두면  그파일은 바이너리 포맷으로 컴파일되지 않는다.
개발자는 이파일들의 판독을 위해 반드시 스트리밍 API를 이용해야 한다. 오디오와 비디오 파일이 여기에 속한다.

/res 폴더에 들어 있는 하위 디렉터리들과 리소스 파일 종류는 다음과 같다.
anim : 컴파일된 애니메이션 파일
drawable :비트맵
layout:UI/뷰 정의
values:배열,컬러,치수,문자열,스타일
xml:컴파일된 임의 XML파일
raw:컴파일되지 않은 미가공 파일

AAPT(Android Asset Packaging Tool, 안드로이드 애셋 패키지화 툴)에 들어있는 리소스 컴파일러는 미가공 리소스를 제외한후 최종 .apk파일을 집어넣는다.

**************************************************************************************
XML 리소스 파서에서는 hello-string같은 이름이 허용되지만 R.java에서 파일 에러 발생한다.
이에러를 바로 잡을려면 대시(-)를 언더바(_)로 고쳐야한다.
**************************************************************************************
문자열 리소스에 대한 추가 내용이다.


일단 simple_string, quoted_string,  double_quoted_string, java_format_string, tagged_string 총  5개를 대해서 물어본다.

우리 R.string.simple_string을 가져온다.
다른방법으로 r.layout.main을 통해서 main.xml에  string을 값을 받아와서 위치지정하고 가져오지만
바로 string.xml을 통해서 가져올수도 있다. getString();통해 가져 온다.
사실 여기서 activity.getString()으로 가져올려고 했지만 이상하게 안되었음 그래서
getResources().getString(); getResources를 통해서 리소스를 가져올수 있다. 하지만 getResoureces는 생략이 가능하다.

결과값


String quoted string같은경우 어떻게 처리되는지 보자



결과값에 ""가 나오지 않는다.
""가 나오게 하려면



double_quotes_string에서처럼 \"큰따옴표\"로 해야한다.


다음은 자바 형식 문자열을 읽어드리는것이다.

%2$s 가 있다. 머사실 저부분을 java에서 코드를 넣는것이다

자바코드에 Hello와 Androd를 String.format을 통해서 javaformatString에 넣는것이다.

자바 형식 문자열을 인자에 전달하여 변환하였다.
여기서 Androd와 Hello의 순서는 String.xml에서 %2 와 %1에 따라 위치가 변경된다.

자 마지막으로 리소스에서 HTML 문자열을 읽어들여 텍스트 뷰에 할당이다



텍스트 뷰에 할당될수 있게  텍스트 Spanned 변환이다.
그러기위해서 android.text.*;를 추가해야한다


'2010년 > 안드로이드' 카테고리의 다른 글

Video infomation 알아내기  (0) 2012.12.26
2011년 02월21일  (0) 2011.02.21
2011년 2월 11일  (0) 2011.02.11
2011년 2월 10일  (0) 2011.02.10
2011년 2월9일  (0) 2011.02.09