본문 바로가기

프로그래밍/안드로이드

[안드로이드] 리소스(Resource)

※ 저는 안드로이드 프로그래밍 정복(김상형 著, 한빛미디어) 책을 이용해 공부하고 있으며

예제와 코드는 이 책을 통해 공부중임을 밝힙니다.

개인적인 공부를 하면서 정리한 형식이기 때문에 심각한 오류가 있을 수 있습니다. 피드백 주시면 정말 감사하겠습니다.


※ 안드로이드 프로그래밍 정복(455~469p) 참조



1. 리소스(Resource) 


프로그램의 흐름이나 동작과 직접적인 상관이 없는, 프로그램 실행에 필요한 데이터

전자는 코드(java폴더)가 담당하며, 후자를 리소스(res폴더)가 관리한다.'


알다시피, 안드로이드 스튜디오 res폴더 내에는 

drawable(이미지), layout(레이아웃), string(문자열)가 정의되어 있다.


drawable 폴더, layout 폴더 등등 생성되어 있다.


 폴더

설명 

읽기 메서드 

drawable 

 이미지 파일, 도형읠 정의하는 XML 파일 

getDrawable 

 layout

화면의 레이아웃 

inflate 

 values

문자열, 색상, 배열, 크기, 스타일 등 여러 가지 값을 정의 

getColor, getText, getString, getDimension 

 mipmap

응용프로그램의 아이콘을 저장 

 

 menu

메뉴 구성 파일 저장 

inflate 

 xml

실행 중에 읽어서 사용할 임의의 XML 파일 저장 

getXml 

 raw

임의의 이진 파일 저장 

openRawResource 

 anim

트윈 애니메이션 리소스 

loadAnimation 

 animator

속성 애니메이션 리소스 

AnimatorInflater, loadAnimator 


해당 폴더가 없을 경우에는 자신이 필요한 경우에 따라서 res 폴더에 오른쪽 버튼을 클릭하고 생성한다.


res 폴더 -> 오른쪽 버튼 클릭 -> Directory 생성


res 내에 존재하는 리소스를 컴파일하여 패키징(packaging)하는 작업은 리소스 컴파일러인 aapt가 담당.

aapt가 하는 또 다른 중요한 작업은 res 하위 폴더의 모든 리소스 ID를 검색하여 R.java파일을 만든다.




2. 리소스 사용


우리는 리소스가 코드에서 활용되고 있다는 걸 알게모르게 경험해왔다.


setContentView 메서드가 대표적이다. 

리소스에 정의된 레이아웃 ID를 인수로 전달받아 내부에서 전개한다.



코드에서 리소스 값을 읽어들여 사용하는 예제를 만들 수 있다.

colors.xml

dimens.xml

strings.xml

에 엘리먼트를 구성한 후 .java에서 값을 읽어오도록 해보자.


dimes.xml에 <string name ~> 이라는 엘리먼트(element)를 추가해보자.


res를 getResources를 선언하고, 각 리소스를 참조하도록 하는 코드를 구성했다.

그런데 왜 이 방법을 쓰는 것일까? 레이아웃 문서에 정의해버리면 속편하지만

각 리소스 값에 분리해두면 여러 가지 장점이 있다.


만약에 색상(textcolor)를 한번에 변경해야 한다고 하면,  일일이 찾아줘야 하지만

colors.xml폴더에 들어가 속성값을 변경해주면 한번에 변경이 가능하다.



3. 스타일


스타일을 사용하면 여러 속성을 묶어서 지정할 수 있고, 비슷한 위젯끼리 일관된 모양을 유지할 수 있다.

res/values 폴더의 styles.xml 파일을 다음과 같이 작성해보자.


styles.xml에 기존 내용은 그대로 두고, 아래에 위와 같이 추가해보자.


위에서 두개의 style을 추가했다.

아래 style에서 주목해야 할 것은 parent인데, 이는 우리가 자바에서 배우는 상속과 똑같다.

@style/red30을 상속받았다는 뜻이다. 그래서 textColor와 textSize는 유지한채

색상을 노란색(#ffff00)과 문자열 속성을 이탤릭(italic)으로 바꾸어 주었다.




위와같이 리니어 레이아웃 안에 세 개의 텍스트를 배치하고 스타일 리스소를 적용했다.

스타일 리스소를 사용하려면 "@style/스타일명" 형식으로 지정한다.


출력결과