• 검색 결과가 없습니다.

안드로이드 앱 프로그래밍 및 실습

N/A
N/A
Protected

Academic year: 2022

Share "안드로이드 앱 프로그래밍 및 실습"

Copied!
23
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

1

안드로이드 앱 프로그래밍 및 실습

(2)

2

목차

1. 안드로이드란? ··· 3

2. 간단한 앱 만들어보기 ··· 7

3. 앱의 동작원리 ··· 17

4. 액티비티 (Activity)··· 24

5. 서비스 (Service) ··· 29

6. 브로드캐스트 리시버 (Broadcast Receiver) ··· 37

7. 컨텐츠 제공자 (Contents Provider) ··· 43

8. 인텐트와 필터 (intent and filter) ··· 53

9. 안드로이드 사용자 인터페이스 (User Interface) 구성 (1) ··· 64

10. 안드로이드 사용자 인터페이스 (User Interface) 구성 (2)··· 81

11. 알림 ··· 86

12. GPS 활용 ··· 92

13. 이메일 보내기 ··· 99

14. SMS 보내기 ··· 103

15. 인터넷 연결 ··· 110

16. 센서 다루기 ··· 117

17. 구글 맵 ··· 123

18. 카메라 다루기 ··· 126

19. 안드로이드 앱 등록 ··· 130

(3)

3 1. 안드로이드란?

구글에서 개발한 Linux 기반의 개방형 운영체제로 스마트폰과 태블릿 컴퓨터에서 동작한다.

현재 계속적으로 버전업이 진행되고 있으며 현재 버전 9 (파이; Pie)까지 진행되고 있다.

안드로이드 주요 기능

기능 설명

UI 직관적으로 사용이 가능한 User Interface 제공

연결성 GSM/EDGE, IDEN, CDMA, EV-DO, UMTS, Bluetooth, Wi-Fi, LTE, NFC, WiMax

저장공간 자료 저장을 위해 SQLite 사용

미디어 지원 H.263, H.264, MPEG4, AMR, AAC, MP3, MIDI, WAV, JPEG, PNG, GIF, BMP

메시지 SMS, MMS

웹 브라우저 WebKit 엔진을 사용하며 크롬과 연동되어 HTML5, CSS3 를 지원

멀티 터치 멀티 테스킹

위젯 사용자가 크기를 확대 축소할 수 있음

다언어 다양한 언어 지원

GCM 클라우드 메시징 지원

WiFi Direct WiFi 를 통한 P2P 연결을 지원

Android Beam NFC 기반으로 폰을 터치함으로 사용자들이 자료를 공유할 수 있는 기술 지원

안드로이드 SDK 및 개발도구 설치

기본 사양: 윈도우 XP 이상, MacOS 10.5.8 이상, Linux GNU C Library 2.7 이상 설치 소프트웨어: Java SDK 5.0 이상, 안드로이드 스튜디오.

안드로이드 스튜디오 설치

안드로이드 스튜디오는 안드로이드용 앱을 개발하기 위한 개발도구로 홈페이지(developer.android.com/AndroidStudio/Download)에서 다운로드 받을 수 있다

developer.android.com

(4)

4

다운받은 파일을 설치한다. (특별한 이유가 없다면 기본 옵션으로 설치하도록 하자.)

(5)

5

안드로이드 구조

Linux Kernel

스마트폰과 스마트폰의 카메라, 디스플레이, 네트워킹 등의 기기들을 연결시키고 각 기기들의 동작을 제어하는 역할을 한다.

라이브러리

안드로이드에는 앱 개발의 편의를 위해 다양한 개발 라이브러리를 지원한다. 아래는 안드로이드에서 지원하는 주요 라이브러리이며 앱 개발시 이들 라이브러리를 임포트해서 라이브러리에서 지원하는 함수들을 개발에 사용할 수 있다.

SQLite: 안드로이드 내부의 자료를 저장하는 데이터베이스 모듈 Libc: 안드로이드 웹 브라우저용 모듈

Media Framework: 미디어 파일 재생 및 녹화 지원 모듈 SSL: 인터넷 통신 보안용 모듈

안드로이드 앱 라이브러리:

android.app – 안드로이드 앱용 기본 라이브러리

android.content – 앱의 접근, 사용, 앱간의 메시징을 담당하는 라이브러ㄹ android.database – SQLite 데이터베이스의 사용을 가능하게 하는 라이브러리 android.opengl – 3D 렌더링을 가능하게 하는 자바용 openGL 라이브러리

(6)

6

android.os – 메시지, 시스템 서비스와 같은 OS 기능을 사용하게 하는 라이브러리 android.text – 화면에 보이는 문자들을 다루는 라이브러리

android.view – 안드로이드 앱용 GUI 컴포넌트

android.widget – UI 에 사용되는 버튼, 레이블, 레이아웃 등에 대한 라이브러리 android.webkit – 웹 브라우징 기능을 지원하는 라이브러리

Android Runtime

자바 버추얼 머신 (Dalvik)이며 앱 개발자가 만든 앱은 이 Runtime 위에서 동작하게 된다.

Application Framework

자바 클래스의 형태로 다양한 서비스를 제공하며 앱 개발자는 이들 서비스를 사용하여 앱을 개발하게 된다.

Activity Manager – 앱의 생성, 활성화, 소멸에 관여한다.

Content Providers – 스마트폰 내의 자료들을 다른 앱들이 사용할 수 있게끔 한다.

Resource Manager – 문자열, 그림 등의 자료들을 활용가능하게 한다.

Notifications Manager – 경고문 또는 메시지을 생성하게 한다.

View System – 사용자 UI 를 만들 수 있게 한다.

여러분들이 만드는 앱 프로그램은 1) ~ 4)의 기반위에 동작한다.

(7)

7 2. 간단한 앱 만들어보기

안드로이드 프로젝트 생성

1) Android Studio 가 설치되었는지 확인하며 아니면 설치하도록 한다.

2) Android Studio 에서 Start a new Android Studio project 를 클릭한다.

3) Choose your project 창에서 Empty Activity 를 선택한다.

4) Next 를 클릭한다.

5) Configure your project 창에 다음 값을 입력한다.

Name: “MyFirstApp”

Package Name: “com.course.myfirstapp”

Use AndroidX artifacts 옆에 있는 상자에 체크 프로젝트 위치 임의로 설정

Language 드롭다운에서 Java 를 선택 다른 옵션은 그대로 둔다.

(8)

8

6) Finish 선택

(9)

9

주요 디렉토리 설명

app > java > com.example.myfirstapp > MainActivity

기본 Activity 입니다(앱의 진입점). 앱을 빌드하고 실행하면 시스템이 이 Activity 의 인스턴스를 시작하고 해당 레이아웃을 로드.

app > res > layout > activity_main.xml

이 XML 파일은 Activity 사용자 인터페이스의 레이아웃을 정의한다.

app > manifests > AndroidManifest.xml

앱의 기본 특징을 설명하고 앱의 각 구성 요소를 정의.

Gradle Scripts > build.gradle

앱을 컴파일하고 빌드하는 방법을 정의하는 데 사용.

앱 실행 방법

실제 기기에서 실행

1) USB 케이블을 사용해 기기를 개발용 컴퓨터에 연결한다. 단 Windows 에서 개발하는 경우 기기에 적합한 USB 드라이버를 설치해야 할 수도 있음.

2) 다음과 같이 Developer options 에서 USB debugging 을 활성화한다.

i. 먼저, 개발자 옵션을 활성화해야 한다.

ii. Settings 앱을 연다.

iii. (Android 8.0 이상에만 해당) System 을 선택.

iv. 아래로 스크롤하여 About phone 을 선택.

v. 아래로 스크롤하여 Build number 를 7 번 탭.

vi. 이전 화면으로 돌아가서 아래쪽의 Developer options 를 찾는다.

vii. Developer options 를 열고, 아래로 스크롤하여 USB debugging 을 찾아 활성화.

3) 다음과 같이 앱을 기기에서 실행.

i. Android Studio 의 Project 창에서 app 모듈을 클릭한 다음, Run > Run 을 선택 (또는 툴바에서 Run 을 클릭).

ii. Select Deployment Target 창에서 기기를 선택하고 OK 를 클릭.

(10)

10

에뮬레이터에서 실행

1) Android Studio 의 Project 창에서 app 모듈을 클릭한 다음, Run > Run 을 선택(또는 툴바에서 Run 을 클릭).

2) Select Deployment Target 창에서 Create New Virtual Device 를 클릭.

3) Select Hardware 화면에서 Pixel 과 같은 휴대폰 기기를 선택한 다음, Next 를 클릭.

(11)

11

4) System Image 화면에서 API 레벨이 최고인 버전을 선택합니다. 해당 버전이 설치되지 않은 경우 Download 링크가 나타나므로 이 링크를 클릭하여 다운로드를 완료.

5) Next 를 클릭.

6) Android Virtual Device (AVD) 화면에서 모든 설정을 그대로 두고 Finish 를 클릭.

7) Select Deployment Target 대화상자로 돌아가서, 방금 생성된 기기를 선택하고 OK 를 클릭.

간단한 사용자 인터페이스 만들기

사용자 인터페이스는 레이아웃과 위젯을 사용하여 만들며, 이를 위해서 Android studio layout editor 를 사용한다.

 레이아웃: 뷰가 화면에 배치되는 방식을 제어하는 컨테이너.

 위젯: 버튼과 텍스트상자 등의 UI 구성요소를 말함.

안드로이드에서는 UI 의 대부분이 XML 파일을 통해 정의되며 app->res->layout-

>activity_main.xml 를 통해 그 내용을 확인할 수 있다. 또한 이 XML 파일을 직접 수정하여 레이아웃을 수정할 수도 있다

레이아웃 에디터 열기

1) Android Studio 의 Project 창에서 app > res > layout > activity_main.xml 을 연다.

2) 편집기에 XML 소스가 표시되면 창 하단에서 Design 탭을 클릭.

3) Select Design Surface 를 클릭하고 Blueprint 를 선택.

4) Layout Editor 툴바에서 Show 를 클릭하고 Show Constraints 가 선택되었는지 확인.

5) Autoconnect 가 꺼져 있는지 확인. (현재 비활성화된 상태이므로) 툴바의 도움말에 Turn On Autoconnect 가 나타나야 한다.

6) 툴바에서 Default Margins 8 을 클릭하고 16 을 선택(나중에 각 뷰에 대해 여백을 조정할 수 있음).

(12)

12

7) 툴바에서 Device for Preview 를 클릭하고 5.5, 1440 × 2560, 560dpi (Pixel XL)을 선택.

% Component Tree

디폴트로 ConstraintLayout 이 설정되어 있다. ConstraintLayout 은 각 뷰간의 제약조건에 따라 각 뷰의 위치를 정의하는 레이아웃을 의미한다.

텍스트 상자 추가하기

1) 레이아웃에 이미 있는 것들을 삭제. 이렇게 하려면 Component Tree 창에서 TextView 를 클릭한 다음 Delete 를 누른다.

2) Palette(레이아웃에디터의 좌측 상단 위치)에서 Text 를 클릭하여 이용 가능한 텍스트 컨트롤을 표시한다.

3) Plain Text 를 디자인 편집기로 드래그하여 레이아웃 상단 근처에 놓는다.

4) 디자인 편집기(중앙의 화면 그림)에서 뷰를 클릭합니다. 이제 각 모서리에 크기 변경 핸들(사각형)이 나타나고 각 측면에 제약 조건 앵커(원으로 표시)가 나타남. 더 나은 제어를 위해서는 편집기에서 Layout Editor 툴바의 버튼을 사용하여 확대(에디터의 + 버튼 클릭)하는 것이 좋다.

5) 상단 쪽의 앵커를 클릭하고 누른 채 레이아웃 상단에 스냅될 때까지 위로 드래그한 다음 누름을 해제한다. 이것이 바로 제약 조건을 말한다. (기본 여백을 16dp 로 설정했으므로) 제약 조건은 레이아웃 상단으로부터 16dp 에 뷰가 있어야 함을 지정한다.

마찬가지로, 뷰 왼쪽에서 레이아웃 왼쪽으로 제약 조건을 만든다.

버튼 추가하기

1) Palette 에서 Buttons 를 클릭.

2) Button 을 디자인 편집기에 드래그하여 오른쪽 근처에 놓는다.

버튼 왼쪽에서 텍스트 상자의 오른쪽으로 제약 조건을 만든다.

UI 문자열 변경

1) Project 창을 열고 app > res > values > strings.xml 을 연다. 안드로이드에서는 단일 위치에서 모든 UI 문자열을 관리할 수 있으므로 UI 문자열의 업데이트 및 현지화를 더욱 쉽게 할 수 있다.

2) 편집기 상단의 Open editor 클릭.

3) Add Key (+)를 클릭하여 새 문자열 만듬.

(13)

13

4) 다음의 또 다른 키를 추가함.

5) res->activity_main 의 레이아웃 디자인으로 돌아가 다음과 같이 문자열 추가 6) 레이아웃에서 텍스트 상자 클릭 후 오른 쪽 사이드 바의 Attribute 클릭.

7) Text 속성을 찾아 그 값(현재는 Name 으로 설정되어 있음)을 삭제하고 오른쪽 버튼을 클릭후 대화상자의 목록에서 edit_message 더블 클릭

8) 버튼에 대해서도 똑같이 실행하여 button_send 선택 후 더블 클릭

유연한 크기의 텍스트 상자 만들기

(14)

14

두 뷰를 선택 (하나 선택 후 shift 를 누른 후 다른 하나 선택) 한 후, 두 뷰 중에 하나를 오른쪽 마우스 버튼을 클릭하고 chain->Create Horizontal Chain 선택한다.

다른 activity 만들기

1) Send 버튼을 누를 때 응답하는 메쏘드를 추가

public class MainActivity extends AppCompatActivity { public static final String EXTRA_MESSAGE =

"com.example.myfirstapp.MESSAGE";

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

/** Called when the user taps the Send button */

public void sendMessage(View view) {

Intent intent = new Intent(this, DisplayMessageActivity.class);

EditText editText = (EditText) findViewById(R.id.editText);

String message = editText.getText().toString();

intent.putExtra(EXTRA_MESSAGE, message);

startActivity(intent);

} }

이 때 View 나 Intent 클래스는 프로그램에서 정의되지 않아 처리할 수 없으므로 오류가 나타나게 된다. 따라서 커서를 View 나 Intent 에 놓은 다음 Alt+Enter (Mac 의 경우 Option+Enter)를 눌러 빠른 수정을 수행한다 (메뉴가 나타나면 Import class 선택). 이때 View 와 Intent 클래스가 import 되어 해당 클래스가 사용 가능하다는 것을 알 수 있다.

DisplayMessageActivity 클래스는 라이브러리에 있는 클래스가 아닌 사용자가 생성하려 하는 class 이므로 선택이 안된다.

2) activity_main.xml 에서 버튼에서 이 메쏘드를 호출하도록 한다.

3) Layout Editor 에서 버튼을 선택한 후 Attribute 에서 onClick 속성을 찾고 sendMessage[MainActivity]를 선택한다.

이때 1)에서 만든 sendMessage(View view) 메쏘드는 매개변수로 view 를 가지는 데 이는 선택한 view 가 매개변수로 전달됨을 알 수 있다.

4) Intent 를 빌드한다.

(15)

15

Intent 는 별도의 구성요소 (여기서는 두개의 Activity)간의 런타임 바인딩을 제공하는 객체를 의미함. Intent 는 두개의 매개변수를 요구하는 데, 첫번째는 Context, 두번째는 Intent 를 전달할 target 클래스 이름을 의미함.

PutExtra() 메쏘드는 EditText 의 값을 인텐트에 추가하는 역할을 하며, startActivty()메쏘드는 Intent 로 지정한 DisplayMessageActivity 의 인스턴스를 시작하게 한다.

5) 두번째 Activity 클래스를 생성한다.

i. Project 창에서 app 폴더를 마우스 오른쪽 버튼으로 클릭하고 New >

Activity > Empty Activity 를 선택합니다.

ii. Configure Activity 창에서 Activity Name 에 "DisplayMessageActivity"를 입력하고 Finish 를 클릭합니다(다른 모든 속성은 기본값으로 그대로 둠).

이 작업으로 인해 DisplayMessageActivity 와 activity_display_message.xml 파일이 추가로 생기게 된다. 또한 AndroidManifest.xml 에 <activity>요소가 추가된다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.course.myfirstapp">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

(16)

16

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".DisplayMessageActivity"></activity>

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

6) 새로운 activity 의 레이아웃에 텍스트 뷰 추가.

i. Activity_display_message.xml 파일을 열고 turn on autoconnect 를 클릭 한다.

ii. 팔레트에서 text 를 클릭한 후 textview 를 레이아웃으로 드래그해 상단 중앙에 놓고 상단 제약조건을 추가한다.

iii. Text 크기와 색을 attribute 에서 변경한다.

7) 새로운 activity 가 메시지를 표시할 수 있도록 DisplayMessageActivity 클래스의 OnCreate() 함수를 변경한다. 변경된 부분은 밑줄로 되어 있는 코드이다.

public class DisplayMessageActivity extends AppCompatActivity { @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_display_message);

// Get the Intent that started this activity and extract the string Intent intent = getIntent();

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

// Capture the layout's TextView and set the string as its text TextView textView = findViewById(R.id.textView);

textView.setText(message);

} }

(17)

17 3. 앱의 동작원리

안드로이드 운영체제는 Linux 기반으로 존재한다. 안드로이드 운영체제의 커널은 리눅스기반으로 완성되어 있으며 각 앱은 Linux 프로세스에서 실행된다. 또한 각 앱은 자체적인 샌드박스 안에 존재하는데 이 샌드박스는 자체적인 가상머신 (VM)을 가지고 있어 앱은 이 가상머신 위에서 동작하게 된다. 따라서 한 앱의 코드는 다른 앱들과 격리된 상태에서 실행된다.

각 앱은 자신의 작업을 수행하기 위해 필요한 요소만 허용 권한을 가지고 있으며 권한이 부여되지 못한 부분은 접근이 안된다. 이를 최소 특권의 원칙이라고 하며 앱이 만약 SMS, 연락처, 카메라 등의 데이터를 액세스 할 필요가 있을 경우 권한을 요청할 수 있으며 이 권한이 부여된 후에 해당 데이터를 이용할 수 있다.

앱의 구성요소

액티비티

사용자 인터페이스가 있는 화면을 나타내는 요소를 말한다. 이메일 앱에서는 이메일 목록 표시 액티비티, 이메일 작성 화면 액티비티, 이메일의 내용을 보여주는 화면을 구성하는 액티비티 들이 있을 수 있다.

액티비티는 따로 독립적인 형태로 존재하며, 따라서 앱에서 다른 앱의 액티비티를 시작할 수 있음.

액티비티는 Activity 의 서브 클래스로 구현됨.

서비스

백그라운드로 실행되는 요소를 의미하며 오랫동안 실행되는 작업 수행. 또는 원격 프로세스를 위한 작업을 서비스라고 한다. 서비스는 오랫동안 백그라운드로 실행되기 때문에 따로 사용자 인터페이스를 제공하지 않고 실행되게 된다. 예를 들면 음악 플레이, 인터넷을 통한 파일 다운로드 등이 서비스의 예라고 할 수 있다.

서비스는 Service 의 서브 클래스로 구현됨.

콘텐츠 제공자

데이터 집합을 관리하는 클래스를 의미한다. 콘텐츠 제공자를 통해 파일 시스템이나 데이터베이스 (SQLite) 또는 연락처 등의 저장소에 접근할 수 있으며 데이터를 쿼리하거나 또는 수정할 수 있다.

브로드캐스트 수신기

(18)

18

시스템의 브로드캐스트 알림에 응답하는 요소를 말한다. 앱이 화면 꺼짐, 배터리 잔량 부족, 사진 캡쳐, 다운로드 완료 등의 알림 브로드캐스팅에 응답할 수 있도록 한다.

따로 사용자 인터페이스를 표시하지는 않지만 상태 표시줄 알림을 생성하여 사용자에게 브로드캐스트 이벤트 발생을 알릴 수 있다.

BroadcastReceiver 의 서브 클래스로 구현된다.

앱 구성요소의 동작

안드로이드에서의 앱들의 구성요소들은 다른 구성요소를 실행할 수 있다.

안드로이드에서는 어떤 앱에서 카메라로 사진을 캡쳐하는 경우, 캡쳐하는 앱을 따로 만들기 보다는 카메라 앱의 해당 기능을 수행하는 액티비티를 실행시켜 필요한 기능을 수행하도록 하는 것이 가능하며, 따라서 안드로이드 앱에서는 main()함수와 같은 단일 시작 지점이 없음.

앱의 프로세스를 시작하면 필요한 클래스가 인스턴스화 되고 다른 앱의 인스턴스를 실행하게 되면 해당 앱의 프로세스가 실행되며 그 프로세스 내에서 액티비티가 실행된다.

다른 구성요소를 시작하기 위해서는 비동기식 메시지가 필요한데 액티비티, 서비스, 브로드캐스트 수신기 간에는 인텐트라고 하는 비동기식 메시지가 활성화되어 다른 구성요소를 실행할 수 있도록 한다. 여기서 인텐트는 다른 구성요소에 작업을 요청하는 메신저 역할을 함.

매니페스트 파일

앱의 구성요소를 선언한다. 시스템이 앱을 시작하려면 앱의 구성요소를 시스템이 파악하여야 하는데 시스템은 AndroidManifest.xml 파일을 읽어 구성요소 파악하게 된다.

아래는 이전에 만든 앱의 매니페스트 파일이다.

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.course.myfirstapp">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".DisplayMessageActivity"></activity>

<activity android:name=".MainActivity">

(19)

19

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

매니페스트에서 앱 구성요소는 다음의 항목 내에서 작성한다.

 액티비티: <activity>

 서비스: <service>

 브로드캐스트: <receiver>

 콘텐츠 제공자: <provider>

앱 리소스

앱에는 소스코드 외에도 오디오 파일, 이미지 파일, 앱의 시각적 표현과 관계된 여러 파일들이 필요하며 이들을 앱 리소스라고 한다. 일부 설정파일들은 XML 로 정의하는 데 특히 인터페이스의 레이아웃은 XML 파일로 정의해야 한다.

안드로이드에서는 앱에 필요한 리소스들을 통합하여 관리할 수 있도록 하고 있으며, 따라서 코드를 수정하지 않고 일련의 대체 리소스를 제공함에 의해 다양한 기기 구성에 맞게 앱을 최적화하고 앱의 업데이트를 용이하게 할 수 있다.

다음은 이전에 만든 앱의 리소스 디렉토리 화면이다.

(20)

20

리소스 디렉토리는 리소스의 특성에 따라 서브디렉토리에 리소스를 저장하도록 하고 있다.

다음 표는 리소스 디렉토리의 서브 디렉토리에서 저장하는 리소스 형태를 나타낸다.

디렉토리 이름 설명

anim/ 애니메이션의 속성을 정의하는 XML 파일을 여기에 저장한다.

R.anim 을 통해 사용할 수 있다.

color/ 색상의 상태 정보를 정의하는 XML 파일을 여기에 저장한다.

R.color 을 통해 사용할 수 있다.

drawable/ .png, .jpg, .gif, XML 파일들을 여기에 저장한다. R.drawable 을 통해 사용할 수 있다.

layout/ 사용자 인터페이스의 레이아웃을 정의하는 XML 파일을 저장한다.

R.layout 을 통해 사용할 수 있다.

menu/ 메뉴의 항목을 정의하는 XML 파일을 저장한다. R.menu 클래스를 통해 사용할 수 있다.

raw/ 임의의 원시형태의 파일이 저장된다.

Resources.openRawResource() 함수를 통해 파일을 읽을 수 있다. R.raw.filename 을 통해 사용할 수 있다.

values/ 문자열, 정수, 색 등의 값들을 담고 있는 XML 파일을 저장한다.

이때 담고 있는 값들의 종류에 따라서 파일이름이 지정되며 해당 파일 이름은 다음과 같다.

array.xml: 리소스 배열값들을 담고 있으며 R.array 을 통해 사용할 수 있다.

integer.xml: 리소스 정수 값들을 담고 있으며 R.integer 을 통해 사용할 수 있다.

bool.xml: 불 대수 값을 담고 있으며 R.boot 을 통해 사용할 수 있다.

colors.xml: 색상값을 담고 있으며 R.color 을 통해 사용할 수 있다.

strings.xml: 문자열 값을 담고 있으며 R.string 을 통해 사용할 수 있다.

style.xml: 스타일 값을 담고 있으며 R.style 을 통해 사용할 수 있다.

xml/ Resources.getXML()함수를 호출하여 런타임으로 읽을 수 있는 임의의 XML 파일을 담고 있다. 다양한 XML 구성파일은 여기에 저장해야 한다.

(21)

21

대체 리소스

모든 애플리케이션이 특정 기기 구성을 지원하는 대체 리소스를 제공해야 한다. 예를 들면 여러 화면 밀도에 맞는 대체 드로우어블 리소스를 포함시켜야 하며 여러 언어에 맞는 대체 문자열 리소스도 포함시켜야 한다. Android 는 런타임에 현재 기기 구성을 감지하고 애플리케이션에 대해 적절한 리소스를 로드한다.

이를 위해서는 <resource_name>-<config_qualifier> 형식으로 이름을 지정하여 /res 디렉토리의 서브 디렉토리 형식으로 새로운 디렉토리를 만든다.

Config-qualifier 는 다음의 사이트의 표 2 를 참고한다.

https://developer.android.com/guide/topics/resources/providing- resources

예 1) res/

drawable/

icon.png

background.png drawable-hdpi/

icon.png

background.png

drawable 디렉토리에는 그림 이미지를 저장하고 있음. drawable-hdpi 는 고화질 화면용 그림 이미지를 저장하고 있음.

예 2) res/

layout/

main.xml (Default layout) layout-ar/

main.xml (Specific layout for Arabic) layout-ldrtl/

main.xml (Any "right-to-left" language, except

for Arabic, because the "ar" language qualifier has a higher precedence.)

ar 은 아라비아문자를 위한 레이아웃. Ldrtl 은 아랍어를 제외한 언어중에 오른쪽에서 왼쪽으로 읽는 문자를 위한 레이아웃.

예 3) res/

layout/

main.xml (Default layout) layout-sw320dp/

main.xml (Specific layout for 320 dp 용 화면) layout-sw600dp/

(22)

22

main.xml (Specific layout for 600 dp 용 화면)

프로그램 코드를 통한 리소스 사용

앱 개발시, 리소스들을 소스코드나 또는 레이아웃 XML 에서 사용할 필요가 있다. 이때 앱이 컴파일된 후 생성된 R 클래스를 활용하여 리소스를 사용 하도록 한다. R 클래스는 res/

디렉토리내의 모든 리소스에 대한 ID 를 가지고 있어 R 클래스를 통해 해당 리소스들을 사용할 수 있다.

예 1) /res/drawable.myimage.png 자원 사용.

ImageView imageView = (ImageView) findViewById(R.id.myimageview);

imageView.setImageResource(R.drawable.myimage);

예 2) 스트링 값 사용

/res/values/strings.xml 에 다음과 같이 문자열의 값을 정의함.

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="hello">Hello, World!</string>

</resources>

코드에서 해당 값을 다음과 같은 방식으로 사용할 수 있음.

TextView msgTextView = (TextView) findViewById(R.id.msg);

msgTextView.setText(R.string.hello);

예 3) 레이아웃에 정의된 리소스 사용

다음의 레이아웃이 res/layout/activity_mail.xml 로 정의된 경우..

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView android:id="@+id/text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello, I am a TextView" />

<Button android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello, I am a Button" />

(23)

23

</LinearLayout>

다음의 코드를 통해 Activity 에서 리소스를 사용할 수 있다.

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

예 4) XML 로 정의된 문자열 값 사용예 res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

<color name="opaque_red">#f00</color>

<string name="hello">Hello!</string>

</resources>

res/layout/activity_main.xml

<?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" />

참조

관련 문서

② Frame Force : Display &gt; Show Element Forces/Stresses &gt; Frame 에서 Load Case 를 선택 하고 Force Component 를 선택하면, 이에 대한 Diagram 을 화면상에

해외취업 희망 청년을 대상으로 맞춤형 연 수로 구인수요에 맞는 인재양성, 해외취업 알선, 해외취업정책지원금 지급, 해외취업 정보제공 등 해외취업

Continuous Run 버튼 Abort Execution 버튼 Pause/Continue 버튼 Text Settings 메뉴 Align Objects 메뉴. Distribute Objects

The fi rst section, run- ning 30km from the under- construction Lusail mega- project to the New Doha International Airport, was valued at $1.65bn (QR6bn) in the

• Marginal cost is the derivative of total cost, TC, with respect to Q, the quantity of output, i.e.

2재화 2요소 헥셔-올린 모형에서는 어느 한 경제에서 어느 한 요소의 양이 증가하면, 그 요소를 집약적으로 사용하는 산업의 생산량은 증가하고 다른

모드 선택 표시 창에서 UNIT CONTROL 모드를 선택하고 SET 버튼을 눌렀을 경우 그림 5 와 같이 LCD 화면에 각 ICU 의 상태가

트 하단의 [create new fill of adjustment layer]를 클릭 후, [gradient map]을 눌러줍니다... 이미지