학습목표 게임이나프로그램에옵션을추가하는방법을알아본다. 이전의프로그램을계속하기위해상태를저장하는방법을알아본다. 게임에서현재의실행위치를저장하는방법에대해알아본다. 내부의파일시스템을읽고쓰는방법에대해알아본다. SD 카드에접근하는방법에대해알아본다. 여러 UI 위젯들에대해알아본다.

Similar documents
학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

( )부록

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

13ÀåÃß°¡ºÐ

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

슬라이드 1

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

03장

어댑터뷰

01장

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

헬로, 안드로이드 7 주차 멀티미디어 강대기동서대학교컴퓨터정보공학부

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

리니어레이아웃 - 2 -

50_1953.pdf

Microsoft PowerPoint - BIT-android pptx

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

구글안드로이드프로그래밍액티비티, 인텐트수신자, 그리고서비스 안드로이드애플리케이션의구성요소에는액티비티, 인텐트수신자, 서비스, 컨텐트제공자가있다. 이번호에서는사용자인터페이스를위한액티비티와백그라운드서비스를위한인텐트수신자, 그리고서비스의라이프사이클과활용법에대해살펴보도록하자.

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

슬라이드 1

Microsoft PowerPoint UI-Layout.Menu.pptx

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

PowerPoint 프레젠테이션

DocsPin_Korean.pages

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

Daum 카페

위젯과레이아웃위젯은 View 클래스를상속해화면디스플레이와이벤트처리를할수있도록구현된스크린구성의최소단위를말한다. android.widget 패키지에는여러유형의위젯들이포함되어있다. TextView, ImageView, Button, ImageButton 등은가장간단한위젯들이

OpenCV와 함께하는 컴퓨터 비전 프로그래밍 캠프

Secure Programming Lecture1 : Introduction

REMON Android SDK GUIDE (SDK Version 1.4.1) 1 / 25

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

PowerPoint Template

안드로이드2_14

JAVA PROGRAMMING 실습 08.다형성

슬라이드 1

// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 c

rmi_박준용_final.PDF

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

헬로, 안드로이드 11 주차 위치파악하기와감지하기 강대기동서대학교컴퓨터정보공학부

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

Dialog Box 실행파일을 Web에 포함시키는 방법

학습목표 인텐트로다른액티비티나프로그램을실행시킬수있다. 웹뷰를통해웹화면을액티비티화면의일부로구성할수있다. 자바스크립트를통해안드로이드프로그램을호출하는방법을안다. 안드로이드응용프로그램에서웹서비스를이용하는방법을안다.

1부

Microsoft PowerPoint App Fundamentals[Part2].pptx

Microsoft PowerPoint App Fundamentals[Part1].pptx

02 C h a p t e r Java

슬라이드 1

MasoJava4_Dongbin.PDF

5장.key

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

01-OOPConcepts(2).PDF

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

슬라이드 1

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

콘텐츠 PowerPoint 디자인

<4D F736F F D20284B B8F0B9D9C0CF20BED6C7C3B8AEC4C9C0CCBCC720C4DCC5D9C3F720C1A2B1D9BCBA2020C1F6C4A720322E302E646F6378>

Interstage5 SOAP서비스 설정 가이드

Microsoft PowerPoint - CSharp-10-예외처리

PowerPoint Presentation

슬라이드 1

12 주차 인텐트

슬라이드 1

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

JMF2_심빈구.PDF

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

뷰그룹 ( 레이아웃 ) 레이아웃이름 ( 클래스이름 ) FrameLayout LinearLayout 설명단일객체를표현하기위한프레임. 왼쪽상단에하나의뷰를배치하기때문에나중 에그린객체만보여준다. 수평또는수직으로자손의뷰를배치. 뷰가들어갈만한공간이없을때는자동으로 스크롤바가나타난다

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Network Programming

TipssoftAppActivity.java // 기본소스파일 main.xml // 배치와구성에관련된리소스파일 string.xml // 프로그램에서사용할문자열에관련된리소스파일 컴파일을하고나면 r.java 라는소스파일이하나추가되는데이파일은리소스파일을소스파일에서이용할수있도

Ext JS À¥¾ÖÇø®ÄÉÀ̼ǰ³¹ß-³¹Àå.PDF

JMF3_심빈구.PDF

변수이름 변수값 PATH ;C:\Program Files\Java\jdk1.8.0_45\bin CLASSPATH.;C:\Program Files\jdk1.8.0_45\lib\tools.jar JAVA_HOME C:\Program Files\Java\jdk1.8.0_45

오핀 (OFIN) SDK Guide Fintech Mobile SDK Guide - Android V 1.0 OPPFLIB 1

C# Programming Guide - Types

Microsoft PowerPoint - 04기본위젯(Ver 1.0)

¾Èµå·ÎÀÌµå ³¹Àå-Åë.PDF

gnu-lee-oop-kor-lec06-3-chap7

신림프로그래머_클린코드.key

슬라이드 1

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

Design Issues

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

제11장 프로세스와 쓰레드

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

쉽게 풀어쓴 C 프로그래밍

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

adlibr-android_4.x

교육2 ? 그림

JUNIT 실습및발표

서현수

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

chapter4

쉽게 풀어쓴 C 프로그래밊

Transcription:

헬로, 안드로이드 9 주차 로컬데이터저장하기 강대기동서대학교컴퓨터정보공학부

학습목표 게임이나프로그램에옵션을추가하는방법을알아본다. 이전의프로그램을계속하기위해상태를저장하는방법을알아본다. 게임에서현재의실행위치를저장하는방법에대해알아본다. 내부의파일시스템을읽고쓰는방법에대해알아본다. SD 카드에접근하는방법에대해알아본다. 여러 UI 위젯들에대해알아본다. 음악재생에있어 Service 클래스를이용하는방법을알아본다.

차례 스도쿠에옵션추가하기 이전게임계속하기 현재위치기억하기 내부파일시스템엑세스하기 SD 카드액세스하기 위젯 메뉴 다이얼로그 ( 대화상자 ) 여러 UI 뷰들 음악재생에 Service 클래스를배경으로사용 요약 퀴즈 연습문제

스도쿠에옵션추가하기 메뉴를누르고설정을선택하면 Settings 액티비티가시작되어사용자가게임옵션을변경가능 Settings 는 PreferenceActivity 의확장이므로, Settings 값은프로그램의기본설정영역에저장 (Settings.java) 옵션키 ( 음악과힌트 ) 는 /res/xml/settings.xml 과동일 Music.Play() 수정하여음악의기본설정을확인하도록함 (Music.java) 힌트의기본설정확인을위해 PuzzleView 수정 (PuzzleView.java)

/src/org/example/sudoku/settings.jav a public class Settings extends PreferenceActivity { // Option names and default values private static final String OPT_MUSIC = "music"; private static final boolean OPT_MUSIC_DEF = true; private static final String OPT_HINTS = "hints"; private static final boolean OPT_HINTS_DEF = true; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.xml.settings); /** Get the current value of the music option */ public static boolean getmusic(context context) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(OPT_MUSIC, OPT_MUSIC_DEF); /** Get the current value of the hints option */ public static boolean gethints(context context) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(OPT_HINTS, OPT_HINTS_DEF);

/src/org/example/sudoku/music.java /** Stop old song and start new one */ public static void play(context context, int resource) { stop(context); // Start music only if not disabled in preferences if (Settings.getMusic(context)) { mp = MediaPlayer.create(context, resource); mp.setlooping(true); mp.start();

/src/org/example/sudoku/puzzleview. java if (Settings.getHints(getContext())) { // Draw the hints... // Pick a hint color based on #moves left Paint hint = new Paint(); int c[] = { getresources().getcolor(r.color.puzzle_hint_0), getresources().getcolor(r.color.puzzle_hint_1), getresources().getcolor(r.color.puzzle_hint_2), ; Rect r = new Rect(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { int movesleft = 9 - game.getusedtiles(i, j).length; if (movesleft < c.length) { getrect(i, j, r); hint.setcolor(c[movesleft]); canvas.drawrect(r, hint);

이전게임계속하기 스마트폰게임의경우, 사용자가아무때고게임을중도에그만둘수있는데, 나중에이어서할수있게해야함 게임의상태정보저장 퍼즐의상태는한타일당한문자, 즉 81 개의문자들의문자열로저장 퍼즐데이터키상수 (PREF_PUZZLE) 및이전게임의계속을위한상수 (DIFFICULTY_CONTINUE) (Game.java) onpause() 에서게임저장 (Game.java) getpuzzle() 에서저장된게임다시읽음. 이때, DIFFICULTY_CONTINUE 확인 (Game.java) 계속하기버튼이눌리면, Sudoku.onClick() 에 DIFFICULTY_CONTINUE 를전달하고 startgame() 을호출하는코드를추가. startgame() 은 Game 액티비티에난이도전달. Game.onCreate() 는 Intent.getIntExtra() 를호출해난이도정보를읽은뒤, 그정보를 getpuzzle() 에전달 액티비티가저절로사라졌다가다시시작되는경우에도게임복원해야함. Game.onCreate() 메서드변경 (Game.java)

/src/org/example/sudoku/game.java private static final String PREF_PUZZLE = "puzzle" ; protected static final int DIFFICULTY_CONTINUE = -1; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Log.d(TAG, "oncreate"); int diff = getintent().getintextra(key_difficulty, DIFFICULTY_EASY); puzzle = getpuzzle(diff); calculateusedtiles(); puzzleview = new PuzzleView(this); setcontentview(puzzleview); puzzleview.requestfocus(); //... // If the activity is restarted, do a continue next time getintent().putextra(key_difficulty, DIFFICULTY_CONTINUE); @Override protected void onpause() { super.onpause(); Log.d(TAG, "onpause"); Music.stop(this); // Save the current puzzle getpreferences(mode_private).edit().putstring(pref_puzzle, topuzzlestring(puzzle)).commit(); /** Given a difficulty level, come up with a new puzzle */ private int[] getpuzzle(int diff) { String puz; switch (diff) { case DIFFICULTY_CONTINUE: puz = getpreferences(mode_private).getstring(pref_puzzle, easypuzzle); break; case DIFFICULTY_HARD: puz = hardpuzzle; break; case DIFFICULTY_MEDIUM: puz = mediumpuzzle; break; case DIFFICULTY_EASY: default: puz = easypuzzle; break; return frompuzzlestring(puz);

/src/org/example/sudoku/sudoku.jav a public void onclick(view v) { switch (v.getid()) { case R.id.continue_button: startgame(game.difficulty_continue); break; //... case R.id.about_button: Intent i = new Intent(this, About.class); startactivity(i); break; // More buttons go here (if any)... case R.id.new_button: opennewgamedialog(); break; case R.id.exit_button: finish(); break;

현재위치기억하기 스도쿠게임도중, 화면방향을바꾸면커서가위치를잃음 사용자가만든 View 인 PuzzleView 를사용하기때문에자동으로상태저장을안함 지속적 (Persistent) 상태와는달리인스턴스 (Instance) 상태는영구적이지않고, 안드로이드어플리케이션스택의 Bundle 클래스에저장됨 인스턴스상태는커서의위치와같은소량의정보에사용됨 Activity.onSaveInstanceState() 는안드로이드는뷰계층구조를따라내려오며 ID 를가진모든뷰에서 View.onSaveInstanceState() 호출함. onrestoreinstancestate() 도동일한작업을함. 여기서 ID 는 XML 에서오지만, PuzzleView 는우리가만든것이므로 setid() 메서드로직접설정함 onsaveinstancestate() 는 Bundle 에슈퍼클래스를호출해서받은상태저장후, 자신의정보저장해서반환. onrestoreinstancestate() 는반대로저장된정보를빼내는것으로, 자기정보를먼저빼내고, 슈퍼클래스의상태정보를빼내도록함

/src/org/example/sudoku/puzzleview. java private static final String SELX = "selx"; private static final String SELY = "sely"; private static final String VIEW_STATE = "viewstate"; private static final int ID = 42; public PuzzleView(Context context) { super(context); this.game = (Game) context; setfocusable(true); setfocusableintouchmode(true); setid(id); @Override protected Parcelable onsaveinstancestate() { Parcelable p = super.onsaveinstancestate(); Log.d(TAG, "onsaveinstancestate"); Bundle bundle = new Bundle(); bundle.putint(selx, selx); bundle.putint(sely, sely); bundle.putparcelable(view_state, p); return bundle; @Override protected void onrestoreinstancestate(parcelable state) { Log.d(TAG, "onrestoreinstancestate"); Bundle bundle = (Bundle) state; select(bundle.getint(selx), bundle.getint(sely)); super.onrestoreinstancestate(bundle.getparcelable(view_state)); return;

내부파일시스템엑세스하기 안드로이드는리눅스기반이므로실제파일시스템이있음. 플래시메모리에저장됨 java.io 의모든입출력루틴은사용가능함 주로액세스하는곳은패키지비공개디렉토리인 /data/data/package_name Context 클래스와이로부터확장된 Activity 클래스는 helper 메서드들을지원함 deletefile(), filelist(), openfileinput(), openfileoutput() 결국내부메모리이므로최대 1~2 메가를넘기지않도록하고, 공간이부족해서생기는오류에조심

SD 카드액세스하기 용량이커서비디오 / 오디오저장에이상적이며, 실행되는프로그램코드를저장할수는없음 명령 mksdcard 256M c:\temp\sd.img 8M 이하로너무작으면에뮬레이터가무시하고, 너무크면로딩시간이오래걸림 에뮬레이터실행시옵션에서 -sdcard c:\temp\sd.img 으로 SD 카드이미지경로지정 파일업로드는다음과같이함 adb push c:\code\samplevideo.mp4 /sdcard/samplevideo.mp4 Video.java 의 oncreate() 메서드수정 video.setvideopath( /sdcard/samplevideo.mp4");

위젯 (Widget) Widget Package Application screen 상에서사용되는 UI 요소를포함하는패키지 View 또는 sub-class 를상속받음 Android UI Structure

android.widget.button 특징 push-button widget 클래스 user 의행위를실행시켜주는것 Listener 등록필요 Sub-Class CheckBox, RadioButton, ToggleButton CompoundButton 의하위클래스 checked / unchecked 2 가지상태를가지는버튼

Listener 등록 Button btn01 = (Button)findViewById(R.id.btn01); btn01.setonclicklistener(new OnClickListener(){ @Override public void onclick(view arg0) { Intent oneint = new Intent(); oneint.putextra(name, Tom"); setresult(res_ok, oneint); finish(); );

Button example <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/button_normal" android:text="@string/buttons_1_normal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/button_small" style="?android:attr/buttonstylesmall" android:text="@string/buttons_1_small" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ToggleButton android:id="@+id/button_toggle" android:text="@string/buttons_1_toggle" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

android.widget.imagebutton 특징 image 를표시하는 button widget 클래스 user 의행위를실행시켜주는것 Listener 등록필요 subclass ZoomButton

ImageButton example <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageButton android:layout_width="100dip" android:layout_height="50dip" android:src="@android:drawable/sym_action_call" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/sym_action_chat" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/sym_action_email" /> </LinearLayout>

ImageButton example <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageButton android:layout_width="100dip" android:layout_height="50dip" android:src="@android:drawable/sym_action_call" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/sym_action_chat" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/sym_action_email" /> </LinearLayout>

메뉴 (android.view.menu) Menu Interface 특징 Menu 안의 item 을관리하는 Interface 모든 Activity 는 option menu 지원 Menu 추가방법 MenuInflater 를사용해서 menu XML file 추가 code 를통해서추가 onoptionsitemselected( MenuItem ) oncontextitemselected( MenuItem )

Menu 종류 Menu Type Context Menus Options Menus Sub Menus Description shortcut, icon, submenu 지원하지않음 menu 타이틀만표시 체크표시아이콘메뉴지원하지않음 보여지는 item 개수보다 menu item 이많을경우, more 라고표시 메뉴 icon 지원하지않음 sub menu 지원

Menu 관련메서드 Prototype public MenuItem add(int titleres) public MenuItem add(charsequence title) public MenuItem add( int groupid, int itemid, int order, CharSequence title) public MenuItem add( int groupid, int itemid, int order, int titleres) Description - menu 에새로운 item 추가 - item 표시할 String 의 Resource ID - 가장최근에추가된메뉴 item 리턴 item 을표시할 text String - item 이속할 group 지정, NONE 그룹지정하지않음 - item 의 unique ID, NONE - item 순서, NONE - item 을표시할 text String item 을표시할 String 의 Resource ID

AndroidManifest.xml 파일에 activity 추 가 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.min.summary" android:versioncode="1 android:versionname="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".menutest android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name=".item android:label="menu_item Activity"> </activity> </application> </manifest>

Menu Interface Example public class MenuTest extends Activity { public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.scroll_view); public boolean oncreateoptionsmenu(menu menu) { menu.add(0, 0, 0, "Go Item View"); return super.oncreateoptionsmenu(menu); public boolean onoptionsitemselected(menuitem item) { switch( item.getitemid() ) { case 0: Intent newactivity = new Intent(this, Item.class ); try{ startactivity( newactivity ); catch(activitynotfoundexception ane ){ break; return super.onoptionsitemselected( item );

Menu 선택시화면 Activity public class Item extends Activity{ protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); TextView tv = new TextView(this); tv.settext("menu item 선택으로나타나는 Activity"); setcontentview(tv);

Menu 선택시화면 Activity public class Item extends Activity{ protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); TextView tv = new TextView(this); tv.settext("menu item 선택으로나타나는 Activity"); setcontentview(tv);

Menu Interface Example

다이얼로그 ( 대화상자 ) android.app.dialog 특징 Dialog 를위한 Base Class Activity 에서 Dialog 생성, 저장관리하는기능제공 Sub Classes Class AlertDialog Description 1 ~ 3 개버튼을가지는 Dialog -- CharacterPickerDialog 강조된문자를선택하는 Dialog -- DatePickerDialog calendar 를 view 로사용해서보여주는클래스 -- ProgressDialog progress indicator, 추가 text message, view 를보여주는클래스 TimePickerDialog - 하루시간을 24hour 또는 AM/PM 모드로선택하는 view 를나타내는 Dialog class

android.app.dialog Dialog & Activity 관련 Classes Method public final boolean requestwindowfeature( int featureid ) Description - 확장된 window 기능사용가능여부 - andorid.view.window 에정의된기능

android.app.dialog Dialog & Activity 관련 Classes android.app.activity package Method Method public Window getwindow() protected Dialog oncreatedialog( int id) protected void onpreparedialog( int id, Dialog dialog) public final void showdialog( int id ) public final void dismissdialog( int id ) public final void removedialog( int id ) Description - activity 를위한 Window 조회해서리턴 - Dialog 생성을위해호출되는 callback method - activity 에의해서생성 & 저장됨 - Dialog 보여주기전에 update 할것이존재할경우 overriding - Dialog 보여주는 method - ShowDialog() 를통해서보여준 Dialog 를해제시켜주는메소드 - Dialog 를제거하는 method

android.app.dialog AlertDialog Class (android.app.alertdialog) 특징 Dialog 의 subclass 1 ~ 3 개의 button 표시 setmessage() : 문자열출력 좀더복잡한 view : FrameLayout 사용 관련 Method Method public AlertDialog.Builder seticon ( int iconid) / seticon ( Drawable icon) public AlertDialog.Builder settitle(int titleid) / settitle(charsequence title) public AlertDialog.Builder setpositivebutton ( int textid, DialogInterface.OnClickListener listener) public AlertDialog.Builder setnegativebutton( int textid, DialogInterface.OnClickListener Listener Description - title 에사용될 Drawable 한 resource Id 설정 - 주어진 resource id / string 을 title 로설정 - 긍정버튼이눌려졌을때처리할 listener 등록 - Listener 의 onclick() overriding 해야함 - 부정버튼이눌려졌을때처리할 listener 등록 - Listener 의 onclick() overriding 해야함

android.app.dialog 관련 Method 계속 Method public AlertDialog.Builder setitems( int itemsid, DialogInterface.OnClickListener listener) setitems( CharSequence[] items, DialogInterface.OnClickListener listener) public AlertDialog.Builder setsinglechoiceitems( int itemsid, int checkeditem, DialogInterface.OnClickListener listener) setsinglechoiceitems( CharSequence[] items, int checkeditem, DialogInterface.OnClickListener listener) public AlertDialog.Builder setpositivebutton ( int textid, DialogInterface.OnClickListener listener) public AlertDialog.Builder setnegativebutton( int textid, DialogInterface.OnClickListener listener) / setnegativebutton(charsequence text, DialogInterface.OnClickListener listener) public AlertDialog.Builder setneutralbutton ( int textid, DialogInterface.OnClickListener listener) / setneutralbutton ( CharSequence text, DialogInterface.OnClickListener listener) Description - Dialog 안에표시되는 List item 설정 - listener 에의해서선택된 item 처리 - itemsid : R.array 처럼배열 type - Dialog 안에표시되는 List item 설정 - 선택된 item text 오른쪽에체크마크표시 - itemsid : R.array 처럼배열 type - 긍정버튼이눌려졌을때처리할 listener 등록 - Listener 의 onclick() overriding 해야함 - 부정버튼이눌려졌을때처리할 listener 등록 - Listener 의 onclick() overriding - 중간버튼이눌러졌을때처리할 Listener 등록 - Listener 의 onclick() overriding

android.content.dialoginterface class Dialog 창의버튼에대한처리를하는 Interface Classes DialogInterface.OnCancelListener DialogInterface.OnClickListener DialogInterface.OnDismissListener DialogInterface.OnKeyListener DialogInterface.OnMultiChoiceClickLi stener Description - cancel 되었을때처리할일 - click 되었을때처리할일 - dismiss 되었을때처리할일 - key event 발생되었을때처리할일 - 다중선택시처리할일

AlertDialog class 예제 01 public class SoDialogTEST extends Activity { ------------------------------------------------------------ public void oncreate(bundle savedinstancestate) { --------------------------------------------------------- protected Dialog oncreatedialog(int id) { AlertDialog myalert; switch(id) { case DIALOG_OK_CANCEL_NO_MESSAGE: myalert = new AlertDialog.Builder( SoDialogTEST.this).setIcon( R.drawable.alert_dialog_icon ).settitle( R.string.alert_dialog_two_buttons_title).setPositiveButton( R.string.alert_dialog_ok, new DialogInterface.OnClickListener(){ @Override public void onclick(dialoginterface arg0, int arg1) { ).setnegativebutton( R.string.alert_dialog_cancel, new DialogInterface.OnClickListener(){ @Override public void onclick(dialoginterface arg0, int arg1) { ).create(); return myalert;

AlertDialog class 예제 02 public class SoDialogTEST extends Activity { ------------------------------------------------------------ public void oncreate(bundle savedinstancestate) { --------------------------------------------------------- protected Dialog oncreatedialog(int id) { AlertDialog myalert; switch(id) { case DIALOG_LIST: myalert = new AlertDialog.Builder(SoDialogTEST.this).setTitle(R.string.select_dialog).setItems(R.array.select_dialog_items, new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { String[] items = getresources().getstringarray(r.array.select_dialog_items); new AlertDialog.Builder(SoDialogTEST.this).setMessage("You selected: " + which + ", " + items[which]).show(); ).create(); return myalert;

android.widget.imageview 특징 image 를표시하는 class 다양한 source ( resource, content provider..) 로부터이미지로딩 image 치수계산 layout manager 에사용됨 다양한표시옵션제공 Nested Class Nested Class ImageView.ScaleType Description 관련 Sub-Classes ImageButton, ZoomButton - image, view 의범위를위한 option class

ImageView class XML Attributes Attributes Name Related Methods Description android:adjustviewboun ds setadjustviewbounds( b oolean ) - ImageView 를 drawable 한비율에맞출지설정 android:maxheight setmaxheight( int ) - view 의최대 height 설정 android:maxwidth setmaxwidth( int ) - view 의최대 width 설정 android:scaletype setscaletype( ImageVie w.scaletype) - ImageView 에맞게 image 를어떻게제어할지설정 android:src setimageresource( int ) - ImageView에그려질수 있는 content 설정 android:tint setcolorfilter( int, PorterDuff.Mode ) - Image 의 tint color 설정

ImageView class 예제 01 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/a ndroid" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingtop="10dip" android:text="@string/image_view_large_normal /> <ImageView android:src="@drawable/sample_1" android:adjustviewbounds="true" android:layout_width="wrap_content" android:layout_height="wrap_content" />

android.widget.imagebutton 특징 image 버튼을표시하는 class press, click 가능 XML Attributes Attributes android.widget.imageview android.view.view Description - ImageView 속성상속받음 - View 속성상속받음

android.webkit.webview 특징 web browsing 을위한 tool 제공하는클래스중하나 web page 표시하는 View WebKit 엔진사용 주의사항 Internet 접속및 web page 로드를위한설정 AndoridManifest.xml 에추가 <manifest xmlns:android="http://schemas.android.com/apk/res/andr oid" package="com.example.android.apis"> <uses-permission android:name="android.permission.internet" />... </manifest>

android.webkit.webview 관련 Method Method public boolean cangoback() public boolean cangobackorforward( int steps ) public Picture capturepicture() public void clearview() public String[] gethttpauthusernamepassword( String host, String realm) public String gettitle () public void loaddata ( String data, String mimetype, String encoding) public void loadurl( String url ) public void loaddatawithbaseurl (String baseurl, String data, String mimetype, String encoding, String failurl ) Description - back history item 을가졌는지여부 - 지정된수만큼 go back / forward 가능여부 - 현재표시되고있는 webview 를챕처하는기능 - view 를지우고, ondraw() 는흰색배경을 drawing - Http 인증 username, password 조회 - 현재 page 의 title 가져오는기능 - webview 에주어진데이터로드 - 주어진 url 로드 - webview 에주어진데이터로드하고, - 주어진 URL 은 content 의 base URL 로적용 (base URL : page 로딩시보여줄화면 )

android.webkit.webview 예제 public class WebBrowserMain extends ListActivity { //------------------------------------------------ //- Member Variable //------------------------------------------------ private final String LOG_TAG=" ===> WebBrowserMain : "; private String[] strlists = {"Call the Browser", "Using WebView"; //------------------------------------------------ //- Overriding Method //------------------------------------------------ //- List 생성 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Log.i(LOG_TAG, "oncreate()"); //- ListActivity 경우기본제공 List layout 존재하기때문에 //- List Item 설정및 data 설정 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, strlists); setlistadapter(adapter);

android.webkit.webview 예제 public class WebBrowserMain extends ListActivity { ------------------------------------------------------------------------------ protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick( l, v, position, id ); switch(position) { case 0: Log.i(LOG_TAG, "onlistitemclick() - gobrowser"); Uri homeuri = Uri.parse("http://www.google.co.kr"); Intent gobrowser = new Intent( Intent.ACTION_VIEW, homeuri ); startactivity(gobrowser); break; case 1: Log.i(LOG_TAG, "onlistitemclick() - gogoogle"); Intent gomybrowser = new Intent( this, WebBrowser.class ); startactivity( gomybrowser ); break;

android.webkit.webview 예제

android.webkit.webview 예제 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true"> <EditText android:id="@+id/insert_url" android:layout_width="fill_parent" android:layout_height="wrap_content" android:autotext="true"/> <WebView android:id="@+id/browser" android:layout_width="fill_parent android:layout_height="fill_parent" android:layout_below="@id/insert_url" android:clickable="true"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal android:layout_alignparentbottom="true"> <Button android:id="@+id/btn_goback" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/go_back"/> <Button android:id="@+id/btn_reload" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/go_reload"/> <Button android:id="@+id/btn_zoomout" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/zoomout"/> <Button android:id="@+id/btn_gourl" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/go_url"/> </LinearLayout> </RelativeLayout>

android.webkit.webview 예제 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- ============================ --> <!-- mybrowser examples strings --> <!-- ============================ --> <string name="go_back"> 뒤로 </string> <string name="go_home"> 홈 </string> <string name="go_reload"> 다시 </string> <string name="zoomin"> 확대 </string> <string name="zoomout"> 축소 </string> <string name="go_url">url...</string> <string name="default_msg">url 입력하요.</string> </resources>

android.webkit.webview 예제 public class WebBrowser extends Activity { //------------------------------------------------ //- Member Variable //------------------------------------------------ private final String LOG_TAG=" ===> WebBrowser : "; private String strdata = "<html><body>my Browser<br><a href='http://www.naver.com'>naver!</a></body></html>"; private String strmimetype = "text/html"; private String strencoding = "utf-8"; WebView mbrowserview; //------------------------------------------------ //- Overriding Method //------------------------------------------------ protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Log.i(LOG_TAG, "oncreate() "); setcontentview( R.layout.mybrowser ); mbrowserview = (WebView)findViewById( R.id.browser ); mbrowserview.loaddata( strdata, strmimetype, strencoding );

android.webkit.webview 예제 protected void oncreate(bundle savedinstancestate) { ---------------------------------------------------- //- Button 처리 Button btngoback = (Button)findViewById(R.id.btn_goback); btngoback.setonclicklistener(new OnClickListener(){ @Override public void onclick(view arg0) { Log.i(LOG_TAG, " btngoback "); mbrowserview.goback(); ); Button btngohome = (Button)findViewById(R.id.btn_gohome); btngohome.setonclicklistener(new OnClickListener(){ public void onclick(view arg0) { Log.i(LOG_TAG, " btngohome "); mbrowserview.loadurl("http://www.naver.com"); );

android.webkit.webview 예제 protected void oncreate(bundle savedinstancestate) { ---------------------------------------------------- //- Button 처리 Button btnreload = (Button)findViewById( R.id.btn_reload ); btnreload.setonclicklistener( new OnClickListener() { public void onclick(view arg0) { Log.i(LOG_TAG, " btnreload "); mbrowserview.reload(); ); Button btnzoomin = (Button)findViewById( R.id.btn_zommin); btnzoomin.setonclicklistener( new OnClickListener(){ public void onclick(view arg0) { Log.i(LOG_TAG, " btnzoomin "); mbrowserview.zoomin(); );

android.webkit.webview 예제 protected void oncreate(bundle savedinstancestate) { ---------------------------------------------------- //- Button 처리 Button btnzoomout = (Button)findViewById(R.id.btn_zoomout); btnzoomout.setonclicklistener(new OnClickListener(){ public void onclick(view arg0) { Log.i(LOG_TAG, " btnzoomout "); mbrowserview.zoomout(); ); Button btnurl = (Button)findViewById(R.id.btn_goURL); btnurl.setonclicklistener(new OnClickListener(){ public void onclick(view arg0) { Log.i(LOG_TAG, " btnzoomout "); EditText inserttxt = (EditText)findViewById(R.id.insert_url); String strurl = inserttxt.gettext().tostring(); mbrowserview.loadurl(strurl); );

android.webkit.webview 예제

음악재생에 Service 클래스를배경으로 사용 ( 한백전자의예제 ) 프로젝트생성 Project Name TestSound Package Name hanback.example.testsound Activity Name TestSound Application Name Test Sound mp3 가져오기 res 폴더아래에 raw 폴더생성 가져오기 (import) 파일시스템선택 MusicService Class 생성 이름 : MusicService 수퍼클래스 : andoroid.app.service onstart(), ondestroy() 구현

MusicService.java package hanback.example.testsound; import android.app.service; import android.content.intent; import android.media.mediaplayer; import android.os.binder; import android.os.ibinder; public class MusicService extends Service { private Binder binder; MediaPlayer mp; @Override public IBinder onbind(intent arg0) { // TODO Auto-generated method stub this.binder = new Binder(); return null; @Override public void ondestroy() { // TODO Auto-generated method stub this.mp.stop(); super.ondestroy(); @Override public void onstart(intent intent, int startid) { // TODO Auto-generated method stub try { this.mp = MediaPlayer.create(this, R.raw.night); catch (Exception e) { super.onstart(intent, startid); this.mp.start();

TestSound.java package hanback.example.testsound; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; public class TestSound extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); Button playbutton = (Button)findViewById(R.id.play_button); playbutton.setonclicklistener(new OnClickListener() { public void onclick(view view) { Intent intent = new Intent(TestSound.this, MusicService.class); startservice(intent); ); Button stopbutton = (Button)findViewById(R.id.stop_button); stopbutton.setonclicklistener(new OnClickListener() { public void onclick(view view) { Intent intent = new Intent(TestSound.this, MusicService.class); stopservice(intent); );

TestSound 실행예

요약 게임이나프로그램에옵션을추가하는방법을알아보았다. 이전의프로그램을계속하기위해상태를저장하는방법을알아보았다. 게임에서현재의실행위치를저장하는방법에대해알아보았다. 내부의파일시스템을읽고쓰는방법에대해알아보았다. SD 카드에접근하는방법에대해알아보았다. 여러 UI 위젯들에대해알아보았다. 음악재생에있어 Service 클래스를이용하는방법을알아보았다.

퀴즈 게임이나프로그램에옵션을추가하는방법을단계적으로설명하라. 이전의프로그램을계속하기위해상태를저장하려면어떤메서드들을오버라이드해야하는가? 지속적상태와인스턴스상태의차이는무엇인가? 안드로이드에서내부의파일시스템을액세스하기위해서는어떻게해야하는가? 특별히해주어야할일은무엇인가? 안드로이드에서 SD 카드이미지를만들려면어떻게해야하는가? 에뮬레이터실행시에 SD 카드이미지를지정해서읽으려면어떻게해야하는가? 웹서버를만드는것과웹브라우저를만드는것중어느것이더어려운가?

연습문제 안드로이드용이미지뷰어를만들어라. 이뷰어는내부메모리나 SD 카드의특정디렉토리의이미지파일들을읽어들여파일이름들을리스트로보여주고사용자가선택하면그것을디스플레이해준다. 앞의웹브라우저예제를기반으로안드로이드용웹브라우저를만들어보라. 기능은구현할수있는모든기능을다동원해서구현해보라.