01 [ 일기장 ] 애플리케이션프로젝트작성 - [MyDiary] 앱 Mobile Apps >> [MyDiary] 앱프로젝트구조설계 일기장애플리케이션인 [MyDiary] 앱은메인화면과일기장의내용을작성하는화면으로이루어져있다. 화면이 2개라는것은액티비티가 2개이고액티비티에대

Similar documents
50_1953.pdf

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

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

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

01장

03장

어댑터뷰

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

리니어레이아웃 - 2 -

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

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

( )부록

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

변수이름 변수값 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

13ÀåÃß°¡ºÐ

1부

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

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

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

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

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

Daum 카페

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

슬라이드 1

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

슬라이드 1

PowerPoint Template

PowerPoint Presentation

SECTION 01 _ 액션바 (ActionBar) 405 액션바만들기 참고프로젝트 ActionBarDemoA1 간단히액션바를만들고이액션바가 WVGA(800*480) 과 WXGA(1280*800) 에서어떻게보이는지확인해보도록하겠다. 액션바를만든다는표현을했지만액션바는타이

01장

슬라이드 1

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

2_안드로이드UI

Microsoft PowerPoint App Fundamentals[Part2].pptx

슬라이드 1

Microsoft PowerPoint - 02처음으로만드는(Ver 1.0)

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint Presentation

서현수

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Microsoft Word - src.doc

Android Master Key Vulnerability

슬라이드 1

PowerPoint 프레젠테이션

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

소프트웨어공학 Tutorial #2: StarUML Eun Man Choi

chap 5: Trees

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

DocsPin_Korean.pages

Studuino소프트웨어 설치

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

ISP and CodeVisionAVR C Compiler.hwp

제8장 자바 GUI 프로그래밍 II

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

Layout

gnu-lee-oop-kor-lec10-1-chap10

4S 1차년도 평가 발표자료

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

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

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

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

Visual Basic 반복문

Database Design Lab: MS Access Queries 1. Download lab6.accdb and rename it to lab7.accdb. 2. 이름 값을가지는쿼리 qryauthor 를만든다 a) Open lab6.accdb. b) 리본메뉴 만들

Secure Programming Lecture1 : Introduction

PowerPoint 프레젠테이션

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

JAVA PROGRAMMING 실습 08.다형성

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

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - 04-UDP Programming.ppt

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

슬라이드 1

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint UI-Layout.Menu.pptx

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Facebook API

슬라이드 1

슬라이드 1

UI VoC Process 안

MF3010 MF Driver Installation Guide

(Microsoft PowerPoint - Ch06.ppt [\310\243\310\257 \270\360\265\345])

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

UI TASK & KEY EVENT

JUNIT 실습및발표

PowerPoint Presentation

슬라이드 1

THE TITLE

슬라이드 1

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

12 주차 인텐트

슬라이드 1

MF5900 Series MF Driver Installation Guide

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

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

Windows 8에서 BioStar 1 설치하기

rosaec_workshop_talk

Transcription:

Chapter 03 일기장앱개발 일기장애플리케이션프로젝트를작성할수있다. 일기장애플리케이션의화면을작성할수있다. 일기장애플리케이션의로직을작성할수있다. { 프로젝트작성하기 Step 1 - [MyDiary] 앱 [ 일기장 ] 애플리케이션프로젝트작성 >> >> Step 2 [ 일기장 ] 애플리케이션의화면설계 Step 3 [ 일기장 ] 애플리케이션의로직작성 이장에서는 [ 일기장 ] 애플리케이션프로젝트를작성하고화면을설계하고프로그래밍로직 코드를작성한다. 234 Part Ⅱ 모바일앱프로젝트실무

01 [ 일기장 ] 애플리케이션프로젝트작성 - [MyDiary] 앱 Mobile Apps >> [MyDiary] 앱프로젝트구조설계 일기장애플리케이션인 [MyDiary] 앱은메인화면과일기장의내용을작성하는화면으로이루어져있다. 화면이 2개라는것은액티비티가 2개이고액티비티에대응되는화면의뷰 ( 레이아웃리소스 ) 도 2개라는것을의미한다. MyDiary 메인화면 내용작성화면 화면의내용 ( 레이아웃리소스 ) 화면의내용 ( 레이아웃리소스 ) 액티비티 액티비티 [MyDiary] 앱프로젝트의개괄적인구조 이두개의화면은단지만드는것에서끝나는것이아니라화면전환이필요하고매니페스트 파일에추가한액티비티도등록해야한다. 따라서애플리케이션프로젝트를만들려면기본적 으로다음과같은작업들이필요하다. 필요한화면의수만큼화면을표시하는액티비티와화면의내용인뷰 ( 레이아웃리소스 ) 가필요하다. 작성 저장 삭제 activity_main.xml 일기목록.................. activity_work.xml Main Activity Work Activity [MyDiary] 앱프로젝트의액티비티와뷰 Chapter 03 일기장앱개발 235

화면간에전환 ( 이동 ) 이필요하다. 화면간의전환은인텐트를사용한다. 메인화면에서내용작성화면으로이동, 내용작성화면에서메인화면으로이동은 Intent 객체를생성하고 startactivity(intent 객체 ) 메서드를사용한다. Intent it = new Intent(this, WorkActivity.class); //Intent 객체생성 startactivity(it); //WorkActivity 로화면이동 추가한액티비티는매니페스트에등록한다. 액티비티가추가된경우, 추가된액티비티에대한정보를 [AndroidManifest.xml] 파일 </application> 위에 <activity> 태그를사용해서작성한다. ~ 생략 <activity android:name= WorkActivity ></activity> </application> 2 개의화면밖에되지않지만, 안드로이드앱을구현하기위해서는안드로이드화면전환 외에도, 파일읽고쓰기위한입출력스트림과저장소를사용하기위한저장기법이추가되어 야한다. 내부저장소를사용한파일입출력스트림을사용한다. // 파일출력스트림 FileOutputStream out = openfileoutput(fname, Context.MODE_PRIVATE) FileInputStream in = openfileinput(fname); // 파일입력스트림 [MyDiary] 앱프로젝트만들기 안드로이드스튜디오에서일기장애플리케이션인 [MyDiary] 앱프로젝트를작성한다. 안드로이드스튜디오는 [ 시작 ]-[ 모든프로그램 ]-[Android Studio]-[Android Studio] 메뉴를선택해서실행한다. 236 Part Ⅱ 모바일앱프로젝트실무

실습 01 일기장앱작성하기 [MyDiary] 앱프로젝트를만들어보자. 01 >> 안드로이드스튜디오에서 [File]-[New Project...] 메뉴를선택한다. [MyDiary] 앱프로젝트작성 1 02 >> [Create New Project] 창에서 [New Project] 화면이표시되면 [Application Name] 항목에 MyDiary 입력, [Company Domain] 항목에 test.work 를 03 >> [Target Android Devices] 화면이표시되 면 [Phone and Tablet] 항목이선택된것을확인 하고 [Next] 버튼을클릭한다. 입력하고 [Next] 버튼을클릭한다. ❶ 클릭 ❷ 클릭 [MyDiary] 앱프로젝트작성 2 [MyDiary] 앱프로젝트작성 3 Chapter 03 일기장앱개발 237

04 >> [Add an activity to Mobile] 화면이표시되 면기본값인 [Blank Activity] 를선택하고 [Next] 버튼을클릭한다. 05 >> [Customize the Activity] 화면이표시되 면기본값을그대로사용하고 [Finish] 버튼을클릭 한다. [MyDiary] 앱프로젝트작성 4 [MyDiary] 앱프로젝트작성 5 06 >> 프로젝트가생성되면다음과같은화면이표시된다. 238 Part Ⅱ 모바일앱프로젝트실무 [MyDiary] 앱프로젝트작성 6

실습 02 이미지를 [MyDiary] 앱프로젝트로가져오기 앱아이콘으로사용할이미지파일을 [MyDiary] 앱으로가져오는것을실습한다. 01 >> 탐색기에서부록 CD 의 [image] 버튼에있는 app_icon.png 파일을 [app]-[res]-[mipmap] 에붙여넣기한다. 02 >> [Choose Destination Directory] 창이표시되면 [~\mipmap-mdpi] 를선택하고 [OK] 버튼을클릭한다. ❶ 클릭 ❷ 클릭 03 >> [Copy] 창이표시되면 [OK] 버튼을클릭한다. 04 >> [app]-[res]-[mipmap] 에파일이가져오기된것을볼수있다. Chapter 03 일기장앱개발 239

실습 03 문자열리소스추가하기 문자열리소스인 [strings.xml] 에문자열등록을실습한다. 01 >> 프로젝트의 [app]-[res]-[values]-[strings.xml] 을더블클릭해서연다. 02 >> 다음과같이변경후저장한다. 추가된내용은진하게표시된부분이다. <resources> <string name= app_name >MyDiary</string> <string name= action_settings >Settings</string> <string name= titlestr > 일기장 </string> <string name= writestr > 작성 </string> <string name= liststr > 목록 </string> <string name= savestr > 저장 </string> <string name= delstr > 삭제 </string> </resources> 03 >> 완성된내용은다음과같다. 240 Part Ⅱ 모바일앱프로젝트실무

02 [ 일기장 ] 애플리케이션의화면설계 Mobile Apps >> 메인화면 - activity_main.xml 화면설계는 [app]-[res]-[layout] 에서 [activity_main.xml] 의내용인 [content_main.xml] 에뷰의레이아웃을배치한다. [content_main.xml] 이편집기뷰에표시되면 [Design] 탭을선택해서레이아웃배치와속성을설정한다. 완성된레이아웃리소스화면과 [Component Tree] 뷰는다음과같다. content_main.xml 화면 [Component Tree] 뷰 Chapter 03 일기장앱개발 241

실습 04 [ 메인화면 ] 작성하기 메인화면의내용인 content_main.xml 에위젯배치실습을한다. 01 >> [content_main.xml] 이편집기뷰에열려있는경우 [content_main.xml] 이표시된 탭으로전환하고, 열려져있지않은경우에는 [app]-[res]-[layout]-[activity_main.xml] 을 더블클릭해서연다. 02 >> 화면의레이아웃배치에표시된 [Design] 탭에서 [Hello World!] 를클릭한후키를 눌러제거한다. 03 >> 팔레트 (Palette) 의 [Widgets]-[Large Text] 위젯을레이아웃배치부분으로드래그 & 드롭해서 TextView 위젯을추가한다. [Large Text] 위젯은표시되는글자의크기가큰 TextView 위젯이다. 242 Part Ⅱ 모바일앱프로젝트실무

주의사항 >> 위젯을배치할때위, 왼쪽등의여백은버전마다조금씩차이가있을수있다. 드래그 & 드롭 04 >> 추가한 TextView 위젯 (Large Text) 을선택한후 [Properties] 뷰의 id 속성의값을 titlelabel 로변경하고 키를누른다. 속성값은스크롤바를이동해서찾는다. 05 >> 이번에는 text 속성값을 @string/titlestr 로수정하기위해, 기본입력된값을클릭하면표시되는 [ ] 버튼을클릭한다. text는 TextView에표시되는문자열을지정하는속성으로, @string/titlestr은 strings. xml에정의된리소스인 titlestr을참조한다는의미이다. 06 >> [Resources] 창에서 titlestr 을선택한후 [OK] 버튼을클릭한다. 다음과같이 TextView 에표시되는문자열이변경된것을확인할수있다. ❶ 클릭 ❷ 클릭 Chapter 03 일기장앱개발 243

07 >> 같은방법으로 [Button] 을끌어다 [ 일기장 ] 옆에드래그 & 드롭한다. 드래그 & 드롭 08 >> 추가한 Button 위젯을선택한후 [Properties] 뷰의 id 속성값을 writebtn, text 속성 값을 @string/writestr 로변경한다. 09 >> 같은방법으로팔레트 (Palette) 의 [Layouts]-[LinearLayout (Vertical)] 위젯을추가 한후, [Properties] 뷰의 id 속성값을 list 로변경한다. 244 Part Ⅱ 모바일앱프로젝트실무

10 >> 레이아웃의배치가끝나면 [File]-[Save all] 을눌러 [activity_main.xml] 을저장한다. 완성된소스코드는 [Text] 탭을눌러서확인한다. 참고사항 >> <RelativeLayout> 을사용해서화면을배치할경우, 위젯을 [Design] 탭에서던져서생성하는순서와기준위젯에따라소스코드가조금씩차이가있을수있다. 이는그다지중요한것은아니며, 화면에위젯의배치결과모양만제대로표시되면된다. Chapter 03 일기장앱개발 245

<?xml version= 1.0 encoding= utf-8?> <RelativeLayout xmlns:android= http://schemas.android.com/apk/res/android xmlns:app= http://schemas.android.com/apk/res-auto xmlns:tools= http://schemas.android.com/tools android:layout_width= match_parent android:layout_height= match_parent android:paddingbottom= @dimen/activity_vertical_margin android:paddingleft= @dimen/activity_horizontal_margin android:paddingright= @dimen/activity_horizontal_margin android:paddingtop= @dimen/activity_vertical_margin app:layout_behavior= @string/appbar_scrolling_view_behavior tools:context= work.test.mydiary.mainactivity tools:showin= @layout/activity_main > <TextView android:layout_width= wrap_content android:layout_height= wrap_content android:textappearance=?android:attr/textappearancelarge android:text= @string/titlestr android:id= @+id/titlelabel android:layout_alignparenttop= true android:layout_alignparentleft= true android:layout_alignparentstart= true /> <Button android:layout_width= wrap_content android:layout_height= wrap_content android:text= @string/writestr android:id= @+id/writebtn android:layout_alignparenttop= true android:layout_alignparentright= true android:layout_alignparentend= true /> <LinearLayout android:orientation= vertical android:layout_width= match_parent android:layout_height= match_parent android:layout_below= @+id/writebtn android:layout_alignparentleft= true android:layout_alignparentstart= true android:id= @+id/list ></LinearLayout> </RelativeLayout> 246 Part Ⅱ 모바일앱프로젝트실무

내용작성화면 - activity_work.xml 화면설계는 [app]-[res]-[layout] 에서 [activity_work.xml] 에뷰의레이아웃을배치한다. [activity_work.xml] 을추가하고편집기뷰에표시되면 [Design] 탭을선택해서레이아웃배치와속성을설정한다. 완성된레이아웃리소스화면과 [Component Tree] 뷰는다음과같다. activity_work.xml 화면 [Component Tree] 뷰 실습 05 [ 내용작성화면 ] 작성하기 내용작성화면인 activity_work.xml 을생성하고위젯배치실습을한다. 01 >> [app]-[res]-[layout] 을선택한후마우스오른쪽버튼을눌러 [New]-[Layout resource file] 메뉴를선택한다. ❶ 오른쪽클릭 ❸ 클릭 ❷ 클릭 Chapter 03 일기장앱개발 247

02 >> [New Resource File] 창에서 [File name] 항목에 activity_work.xml, [Root element] 항목에 RelativeLayout 을입력한후 [OK] 버튼을클릭한다. ❶ 입력 ❷ 클릭 03 >> [activity_work.xml] 이편집기뷰에열리면, 팔레트 (Palette) 의 [Widgets]-[Button] 위젯을추가하고 [Properties] 뷰의 id 속성값을 listbtn, text 속성값을 @string/liststr 로 변경한다. 04 >> 같은방법으로 [Widgets]-[Button] 위젯을추가하고, [Properties] 뷰의 id 속성값을 savebtn, text 속성값을 @string/savestr 로변경한다. 05 >> 같은방법으로 [Widgets]-[Button] 위젯을추가하고, [Properties] 뷰의 id 속성값을 delbtn, text 속성값을 @string/delstr 로변경한다. 248 Part Ⅱ 모바일앱프로젝트실무

06 >> 같은방법으로팔레트 (Palette) 의 [Text Fields]-[Multiline Text] 위젯을추가하고 [Properties] 뷰의 layout:width 속성값과 layout:height 값을 match_parent, gravity 속성 값을 top, id 속성값을 edit 로변경한다. 07 >> 레이아웃의배치가끝나면 [File]-[Save all] 을눌러 [activity_main.xml] 을저장한다. 완성된소스코드는 [Text] 탭을눌러서확인한다. Chapter 03 일기장앱개발 249

<?xml version= 1.0 encoding= utf-8?> <RelativeLayout xmlns:android= http://schemas.android.com/apk/res/android android:layout_width= match_parent android:layout_height= match_ parent > <Button android:layout_width= wrap_content android:layout_height= wrap_content android:text= @string/liststr android:id= @+id/listbtn android:layout_alignparenttop= true android:layout_alignparentleft= true android:layout_alignparentstart= true /> <Button android:layout_width= wrap_content android:layout_height= wrap_content android:text= @string/savestr android:id= @+id/savebtn android:layout_alignparenttop= true android:layout_centerhorizontal= true /> <Button android:layout_width= wrap_content android:layout_height= wrap_content android:text= @string/delstr android:id= @+id/delbtn android:layout_alignbottom= @+id/savebtn android:layout_alignparentright= true android:layout_alignparentend= true /> <EditText android:layout_width= match_parent android:layout_height= match_parent android:inputtype= textmultiline android:ems= 10 android:id= @+id/edit android:layout_below= @+id/listbtn android:layout_tostartof= @+id/savebtn android:layout_alignright= @+id/delbtn android:layout_alignend= @+id/delbtn android:gravity= top /> </RelativeLayout> 250 Part Ⅱ 모바일앱프로젝트실무

03 [ 일기장 ] 애플리케이션의로직작성 Mobile Apps >> [MyDiary] 앱은메인화면로직인 MainActivity 와내용작성화면로직인 WorkActivity 가있다. 메인화면로직 : MainActivity.class 메인화면의로직인 MainActivity 에서는다음의사항을구현한다. ❶ 일기 1~ ❷ 일기목록표시 ❸ 작성된일기내용표시 내용작성화면 메인화면 메인화면 내용작성화면 ❶ [ 작성 ] 버튼을클릭하면 [ 내용작성화면 ] 표시 Intent it = new Intent(this, WorkActivity.class); //Intent 객체생성 it.putextra( fname, new ); // 새로작성될일기정보보냄. startactivity(it); //WorkActivity로화면이동 ❷ 일기의목록표시 Intent it = new Intent(this, MainActivity.class); //Intent 객체생성 startactivity(it); //MainActivity 로화면이동 ❸ 작성된일기목록을클릭하면해당일기의내용이 [ 내용작성화면 ] 표시 Intent it = new Intent(this, WorkActivity.class); //Intent 객체생성 it.putextra( fname, tlabel); // 클릭한일기의파일명을보냄 startactivity(it); //WorkActivity로화면이동 Chapter 03 일기장앱개발 251

실습 06 메인화면로직작성 메인화면로직인 MainActivity 에로직을작성하는실습을한다. 01 >> [app]-[java] 의첫번째 [work.test.mydiary] 패키지에있는 [MainActivity.java] 가 열려있으면해당탭으로이동하고, 열려있지않으면더블클릭해서연다. 02 >> 패키지, 임포트, 클래스선언, 멤버필드선언작성 : 자동생성된파일에서패키지문, 임포트문, 클래스선언, 멤버필드선언을작성한다. 패키지문 임포트문 클래스선언문 멤버필드선언문으로, [ 작성 ] 버튼저장 03 >> oncreate(bundle) 메서드에액티비티가생성되면처리할작업을작성한다. 자동생성된 oncreate(bundle) 메서드의마지막에일기목록을로드하는 loadlist() 메서드호출과 [ 작성 ] 버튼의참조및이벤트리스너등록을작성한다. 이액티비티가표시하는화면내용 자동완성된툴바사용코드 자동완성된플로팅액션버튼이벤트설정 작성된일기파일들을화면에표시 [ 작성 ] 버튼을참조하고이벤트리스너등록 252 Part Ⅱ 모바일앱프로젝트실무

04 >> 일기목록을로드하는 loadlist() 메서드를작성한다. 일기항목을표시하는데사용 하는 TextView 객체를생성하는 maketextview(string, String) 메서드를호출하고 LinearLayout 객체인 layout 에 layout.addview() 메서드를사용해서추가한다. 작성된일기항목전체 작성된일기항목이없으면 작성된일기항목을표시할레이아웃과배경색 작성된일기항목이있으면 작성된일기항목을화면에표시 스마트폰에서실행시필요 05 >> 일기항목을표시하는 TextView 객체를생성하는 maketextview(string, String) 메서드를작성한다. 각각의일기항목을표시하는 TextView 객체를생성하고레이블과태그를 추가하고이벤트리스너를등록한다. TextView 객체를생성하고레이블을추가하고, 태그추가및이벤트리스너등록 06 >> onclick(view) 메서드를작성한다. [ 작성 ] 버튼또는일기목록을클릭하면자동실행되 며, WorkActivity 를호출 ( 내용작성화면으로이동 ) 한다. 이때 [ 작성 ] 버튼을클릭하면새로 작성하고, 일기목록을클릭하면작성된일기의미리보기및수정, 삭제가가능하다. [ 작성 ] 버튼클릭시수행 일기목록클릭시수행 WorkActivity 를호출해서내용작성화면으로이동. 자신의액티비티는닫음. Chapter 03 일기장앱개발 253

07 >> oncreateoptionsmenu(menu), onoptionsitemselected(menuitem) 메서드를작성 한다. 자동생성되는메서드로 oncreateoptionsmenu(menu) 은옵션메뉴를생성하고, on- OptionsItemSelected(MenuItem) 은옵션메뉴항목을클릭하면이벤트를처리할때사용한다. 08 >> MainActivity 액티비티의완성된내용은다음과같다. package work.test.mydiary; import android.content.intent; import android.graphics.color; import android.os.bundle; import android.support.design.widget.floatingactionbutton; import android.support.design.widget.snackbar; import android.support.v7.app.appcompatactivity; import android.support.v7.widget.toolbar; import android.view.view; import android.view.menu; import android.view.menuitem; import android.widget.button; import android.widget.linearlayout; import android.widget.textview; public class MainActivity extends AppCompatActivity implements View. OnClickListener{ Button writebtn; 254 Part Ⅱ 모바일앱프로젝트실무

실행 @Override protected void oncreate(bundle savedinstancestate) {// 액티비티생성시자동 super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Toolbar toolbar = (Toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(toolbar); FloatingActionButton fab = (FloatingActionButton) findviewbyid(r. id.fab); fab.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view view) { Snackbar.make(view, Replace with your own action, Snackbar. LENGTH_LONG).setAction( Action, null).show(); ); loadlist(); // 작성된일기항목가져옴 writebtn = (Button)findViewById(R.id.writeBtn); writebtn.setonclicklistener(this); public void loadlist(){// 적성된일기항목가져오는작업 LinearLayout layout = (LinearLayout)findViewById(R.id.list); layout.setbackgroundcolor(color.argb(100, 0, 0, 66)); String[] lists = filelist(); if(lists.equals(null) lists.length == 0){ layout.addview(maketextview( 작성된일기가없습니다., nt )); else{ layout.removeallviews(); for(int i=0; i<lists.length; i++){ if(lists[i].endswith(.txt )) layout.addview(maketextview(lists[i], t +i)); if(layout.getchildcount() == 0) layout.addview(maketextview( 작성된일기가없습니다., nt )); public TextView maketextview(string label, String tag){//textview 생성 TextView tv = new TextView(this); Chapter 03 일기장앱개발 255

tv.settext(label); tv.settag(tag); tv.setonclicklistener(this); return tv; @Override public void onclick(view v) {//[ 작성 ] 버튼또는일기목록을클릭하면자동실행 Intent it = new Intent(MainActivity.this, WorkActivity.class); if( v == writebtn){ it.putextra( fname, new ); else{ TextView tv = (TextView)v; String tlabel = (String)tv.getText(); it.putextra( fname, tlabel); startactivity(it); finish(); @Override public boolean oncreateoptionsmenu(menu menu) {// 옵션메뉴 //Inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.menu_main, menu); return true; @Override public boolean onoptionsitemselected(menuitem item) {// 옵션메뉴항목클릭시자동실행 // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getitemid(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; return super.onoptionsitemselected(item); 256 Part Ⅱ 모바일앱프로젝트실무

내용작성화면로직 : WorkActivity.class 내용작성화면의로직인 WorkActivity 에서는다음의사항을구현한다. ❶ ❸ 파일삭제 ❷ 입력내용파일로저장 메인화면 내용작성화면 메인화면 내용작성화면 ❶ [ 목록 ] 버튼을클릭하면 [ 메인화면 ] 표시 Intent it = new Intent(this, MainActivity.class); //Intent 객체생성 startactivity(it); //MainActivity 로화면이동 ❷ [ 저장 ] 버튼을클릭하면입력한내용을파일로저장 String cstr = content.gettext().tostring(); // 입력한내용 savefile(this,cstr); // 파일로저장 ❸ [ 삭제 ] 버튼을클릭하면표시된내용의파일삭제후메인화면으로이동 deletefile(fname); // 표시된내용의파일삭제 returnmain(); // 메인화면으로이동 실습 07 내용작성화면로직작성 내용작성화면의로직인 WorkActivity 에로직을작성하는실습을한다. 01 >> [app]-[java] 의첫번째 [app]-[java] 의첫번째 [work.test.mydiary] 패키지에있는 [WorkActivity.java] 가열려있으면해당탭으로이동하고, 열려있지않으면더블클릭해서연다. Chapter 03 일기장앱개발 257

02 >> 패키지, 임포트, 클래스선언, 멤버필드선언을작성한다. 자동생성된파일에서패키지 문, 임포트문, 클래스선언, 멤버필드선언을작성한다. 패키지, 임포트문 내용입력란저장 파일명저장 [ 목록 ], [ 저장 ], [ 삭제 ] 버튼저장 03 >> oncreate(bundle) 메서드를생성하고액티비티가생성되면처리할작업을작성한다. oncreate(bundle) 메서드를직접만들고, MainAcitivity 에서넘어오는정보의분석및 [ 목록 ], [ 저장 ], [ 삭제 ] 버튼의참조와이벤트리스너등록을작성한다. 액티비티의화면내용 내용입력란을참조하고배경색설정 MainActivity 에서넘어온파일명을얻어냄 파일명이 new 이면파일명을생성 파일명이 new 가아니면기존파일을읽어옴 [ 목록 ] 버튼을참조하고이벤트리스너등록 [ 저장 ] 버튼을참조하고이벤트리스너등록 [ 삭제 ] 버튼을참조하고이벤트리스너등록 258 Part Ⅱ 모바일앱프로젝트실무

04 >> 작성된일기의내용을표시하는 readfile(context) 메서드를작성한다. MainAcitivity 에서일기의목록을클릭하면해당일기의내용이표시되도록작성한다. 저장된파일을읽어서 out 에저장한후이메서드를호출한곳으로읽은파일의내용을보냄. 05 >> 작성한일기를저장하는 savefile(context, String) 메서드를작성한다. 일기를작성 하고 [ 저장 ] 버튼을누르면지정된파일명에작성된내용을파일로저장한다. fname 변수에저장된값으로파일을생성하고, 내용입력란에입력한값을파일에저장 Chapter 03 일기장앱개발 259

06 >> MainAcitivity 를호출하는 returnmain() 메서드를작성한다. MainAcitivity 를호출 해서메인화면으로이동하는작업을작성한다. MainActivity 를호출해서메인화면으로이동. 자신의액티비티는닫음. 07 >> onclick(view) 메서드를작성한다. - [ 목록 ], [ 저장 ], [ 삭제 ] 버튼을누르면자동실행된다. [ 목록 ] 버튼을누르면 return- Main() 메서드를호출해서메인화면으로이동한다. - [ 저장 ] 버튼을누르면 savefile(context, String) 메서드를호출해서작성한내용을파일로저장한다. - [ 삭제 ] 버튼을누르면지정한파일을삭제하고 returnmain() 메서드를호출해서메인화면으로이동한다. [ 목록 ] 버튼을클릭하면수행 [ 저장 ] 버튼을클릭하면수행 [ 삭제 ] 버튼을클릭하면수행 260 Part Ⅱ 모바일앱프로젝트실무

08 >> WorkActivity 액티비티의완성된내용은다음과같다. package work.test.mydiary; import android.app.activity; import android.content.context; import android.content.intent; import android.graphics.color; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.toast; import java.io.bytearrayoutputstream; import java.io.fileinputstream; import java.io.fileoutputstream; public class WorkActivity extends Activity implements View.OnClickListener{ EditText content; Button listbtn, savebtn, delbtn; String fname; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_work); content = (EditText)findViewById(R.id.edit); content.setbackgroundcolor(color.argb(100, 255, 255, 99)); Bundle params = getintent().getextras();// 넘어온정보를얻어냄 fname = params.getstring( fname ); if(fname.equals( new )){// 새로작성 fname = System.currentTimeMillis()+.txt ; Toast.makeText(this, 새로운일기를입력하세요., Toast.LENGTH_SHORT).show(); else{// 기존파일읽어옴 content.settext(readfile(this)); Toast.makeText(this, 저장된일기를표시합니다., Toast.LENGTH_SHORT).show(); listbtn = (Button)findViewById(R.id.listBtn); Chapter 03 일기장앱개발 261

listbtn.setonclicklistener(this); savebtn = (Button)findViewById(R.id.saveBtn); savebtn.setonclicklistener(this); delbtn = (Button)findViewById(R.id.delBtn); delbtn.setonclicklistener(this); public String readfile(context c){// 저장된파일읽어옴 FileInputStream in = null; // 파일입력스트림 ByteArrayOutputStream out = null; // 읽은내용을임시로저장할버퍼 int len = 0; // 한번에읽을수있는내용의크기 byte[] bstr = new byte[1024]; // 버퍼생성 try{ //FileInputStream 객체를얻어냄 in = c.openfileinput(fname); // 읽은내용을저장할버퍼생성 out = new ByteArrayOutputStream(); // 파일의끝이아닐때까지반복수행 while((len = in.read(bstr))!= -1) out.write(bstr, 0, len); // 읽은내용을버퍼에저장 // 입출력스트림닫음 out.close(); in.close(); catch(exception e){ try{ if(out!= null) out.close(); if(in!= null) in.close(); catch(exception e2){ e2.printstacktrace(); // 버퍼의내용을문자열로변환해리턴 return out.tostring(); public void savefile(context c, String cstr){// 파일생성및입력된내용저장 FileOutputStream out = null; // 파일출력스트림 byte[] bstr = cstr.getbytes(); // 문자열을바이트배열로변환 262 Part Ⅱ 모바일앱프로젝트실무

try{ //FileOutputStream 객체생성 - 파일생성 out = c.openfileoutput(fname, Context.MODE_PRIVATE); out.write(bstr, 0, bstr.length);// 파일에내용을씀 out.close();// 스트림닫음 - 리소스해제 catch(exception e){ try{ if(out!= null) out.close(); catch(exception e2){ e2.printstacktrace(); public void returnmain(){ Intent it = new Intent(this, MainActivity.class); startactivity(it); finish(); @Override public void onclick(view v) {//[ 목록 ],[ 저장 ], [ 삭제 ] 버튼을누르면자동실행 if(v == listbtn){ returnmain(); else if(v == savebtn){ String cstr = content.gettext().tostring(); savefile(this,cstr); Toast.makeText(this, 파일이저장되었습니다.,Toast.LENGTH_SHORT).show(); else if(v == delbtn){ deletefile(fname); content.settext( ); Toast.makeText(this, 파일이삭제되었습니다.,Toast.LENGTH_SHORT).show(); returnmain(); Chapter 03 일기장앱개발 263

실습 08 매니페스트파일설정변경 AndroidManifest.xml 파일에서앱아이콘을변경하고 WorkActivity 를추가해보자. 01 >> [app]-[manifests] 에서 AndroidManifest.xml 파일을더블클릭해서연다. 02 >> 앱아이콘을 app_icon 으로변경한다. 03 >> </application> 태그위에 <activity android:name= WorkActivity ></activity> 를 추가한다. 04 >> 수정된 AndroidManifest.xml 파일은다음과같다. <?xml version= 1.0 encoding= utf-8?> <manifest xmlns:android= http://schemas.android.com/apk/res/android package= work.test.mydiary > <application android:allowbackup= true android:icon= @mipmap/app_icon android:label= @string/app_name android:supportsrtl= true android:theme= @style/apptheme > <activity android:name=.mainactivity android:label= @string/app_name 264 Part Ⅱ 모바일앱프로젝트실무

android:theme= @style/apptheme.noactionbar > <intent-filter> <action android:name= android.intent.action.main /> <category android:name= android.intent.category.launcher /> </intent-filter> </activity> <activity android:name= WorkActivity ></activity> </application> </manifest> 여기서는작성한 [MyDiary] 앱을가상디바이스와실제안드로이드디바이스 ( 안드로이드폰 ) 에서실행한다. Chapter 03 일기장앱개발 265