이번 글은 http://code.google.com/android/intro/tutorial-ex2.html 을 보면서
나름대로 정리한것입니다.
이번에는 전에 만들었던 myNopadv1를 바꾸어가며 만듭니다. tutorial에서 원하는데로 기존것을 import하면서 만드는것은
우리 스타일이 아닙니다. 이번에 집중하고자 하는것은 뭘 많이 바꾸어가는데, 왜 바꾸는건지 왜 새로운 코드를 집어넣는 건지를 집어가며
합니다.
일단 쉬운것 부터 합니다. 스크린 레이아웃 부터 봅니다. Notepadv2Soultion에 있는 res쪽을 먼저
봅니다.
.
1. layout에 파일이 못보던게 두개있습니다.
notes_list.xml - 기존에 있던 notepad_list.xml의 내용을 좀 바꾼것입니다.
note_edit.xml - 이름 그대로 노트내용을 집어넣고 저장하는 화면입니다.
.
2. notes_row.xml는 바뀐게 없습니다.
.
1. layout에 파일이 못보던게 두개있습니다.
notes_list.xml - 기존에 있던 notepad_list.xml의 내용을 좀 바꾼것입니다.
note_edit.xml - 이름 그대로 노트내용을 집어넣고 저장하는 화면입니다.
.
2. notes_row.xml는 바뀐게 없습니다.
notes_list.xml 을 좀 더 자세히 봅니다.
끝에서 두번째 줄에 android:text="@string/no_notes" 가 android:text="No Notes!" 로 바뀐것 밖에는 없습니다.
이건 values/strings.xml의 no_notes를 더이상 쓰지않는다고 받아들이면 될것 같습니다. 우린 그냥 그대로 두고 갑니다.
끝에서 두번째 줄에 android:text="@string/no_notes" 가 android:text="No Notes!" 로 바뀐것 밖에는 없습니다.
이건 values/strings.xml의 no_notes를 더이상 쓰지않는다고 받아들이면 될것 같습니다. 우린 그냥 그대로 두고 갑니다.
note_edit.xml 는 새것이니까 다 넣어야 합니다.
android:text="@string/XXXX" 만 다 뽑아보이까,
@string/title 와
@string/body,
@string/confirm 로 세개 있습니다.
values/strings.xml에 새로추가되었을 것임을 짐작할수있습니다.
또 Button이라는 못보던것이 있습니다. 그 내용으로 확인 버튼이라 짐작하고 넘어갑니다.
android:text="@string/XXXX" 만 다 뽑아보이까,
@string/title 와
@string/body,
@string/confirm 로 세개 있습니다.
values/strings.xml에 새로추가되었을 것임을 짐작할수있습니다.
또 Button이라는 못보던것이 있습니다. 그 내용으로 확인 버튼이라 짐작하고 넘어갑니다.
.
스크린 레이아웃쪽은 끝났습니다. 이제 src밑에있는 java 소스를 봅니다.
스크린 레이아웃쪽은 끝났습니다. 이제 src밑에있는 java 소스를 봅니다.
3. 역시 NoteEdit.java라 해서 노트내용의 수정을 담당할것으로 추정되는 부분이 추가되었습니다.
만들어 봅니다.
eclipse에서 File > New > Class 로 가서
eclipse에서 File > New > Class 로 가서
Source folder: myNotepadv1/src
Package: com.android.demo.mynotepad1
Name: NoteEdit
Modifiers: public
Superclass: android.app.Activity - 소스에 보면 Activity를 상속하고 있음을 봅니다.
[Finish] 버튼을 누릅니다.
Package: com.android.demo.mynotepad1
Name: NoteEdit
Modifiers: public
Superclass: android.app.Activity - 소스에 보면 Activity를 상속하고 있음을 봅니다.
[Finish] 버튼을 누릅니다.
class 를 coding할수있는 껍데기가 생겼습니다. onCreate()를 override하기 위해 editor에서 마우스오른쪽
부분을 누릅니다.
Source > Override/Implement methods로 가서 onCreate(Bundle)을 찾아 선택하고
[OK]버튼을 누릅니다..
이제 Notepadv2Solution에 있는 NoteEdit.java와 똑 같이 프로그램을 쳐넣습니다.
프로그램을 한번 훝어 봅니다.
1. 프로그램을 자세히보면 상단에 setContentView(R.layout.note_edit); 라고해서 note_edit.xml 대로 화면을 만들라 지시하는 부분이 보입니다.
2. 그 아래에는 Button confirmButton = (Button) findViewById(R.id.confirm); 로 버튼 오브젝트를 만드는 것도 보입니다.
3. 또 하나 크게 눈에 띄는 부분이 Intent란 건데,
confirmButton.setOnClickListener(new View.OnClickListener() ...
의 형태로 버튼에 event listener를 붙이는것을 볼수있습니다. 밑에 onClick()에서 보듯이 click이들어오면 현재 입력된 스트린을 Bundle에 넣고 Intent를 통해 어디로 넘기는 군요. 재미있는것이 바로 데이터베이스로 보내지않고 Intent (의도) 로 이름지어 일단 어딘가 담아주면서 RESULT_OK 신호를 보냅니다. 도대체 왜 이렇게 복잡하게 해야하는건지..
4. 또 Bundle에 데이터를 넣고 빼는 법을 주시할 필요가 있습니다. Bundle은 그냥 노트제목.ID,내용을 가진 주머니라 생각하면됩니다.
1. 프로그램을 자세히보면 상단에 setContentView(R.layout.note_edit); 라고해서 note_edit.xml 대로 화면을 만들라 지시하는 부분이 보입니다.
2. 그 아래에는 Button confirmButton = (Button) findViewById(R.id.confirm); 로 버튼 오브젝트를 만드는 것도 보입니다.
3. 또 하나 크게 눈에 띄는 부분이 Intent란 건데,
confirmButton.setOnClickListener(new View.OnClickListener() ...
의 형태로 버튼에 event listener를 붙이는것을 볼수있습니다. 밑에 onClick()에서 보듯이 click이들어오면 현재 입력된 스트린을 Bundle에 넣고 Intent를 통해 어디로 넘기는 군요. 재미있는것이 바로 데이터베이스로 보내지않고 Intent (의도) 로 이름지어 일단 어딘가 담아주면서 RESULT_OK 신호를 보냅니다. 도대체 왜 이렇게 복잡하게 해야하는건지..
4. 또 Bundle에 데이터를 넣고 빼는 법을 주시할 필요가 있습니다. Bundle은 그냥 노트제목.ID,내용을 가진 주머니라 생각하면됩니다.
요렇게 넣고 ...
bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
요렇게 뺍니다 ...
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
.
4. 이제 myNotepadv1.java를 어떻게 고쳐야 할지를 봅니다. 일단 Notepadv2.java 와 비교해 봅니다.
4. 이제 myNotepadv1.java를 어떻게 고쳐야 할지를 봅니다. 일단 Notepadv2.java 와 비교해 봅니다.
1. 상단에 private static final int DELETE_ID = Menu.FIRST + 1; 로 Menu Item을 하나
더 추가 했습니다. 이후에 menu.add(0, DELETE_ID,0, R.string.menu_delete); 이 있는것으로 보아
values/strings.xml 에 menu_delete가 추가 될것으로 짐작됩니다.
2. private Cursor mNotesCursor; 로 예전에 fillData() 안에 있던 Cursor선언부 를 밖으로 빼냈습니다. 일단 filData() 는 바뀝것이 없군요.
3. 예전에는 onOptionsItemSelected() 로 선택된 메뉴아이템을 알았는데 이번에는 onMenuItemSelected() 로 아이템선텍을 잡아내는군요. 별 차이는 없어보입니다.
4. createNote()에 보면 노트 만드는 방법이 바뀝니다. 예전에는 데이터베이스로 바로 넘겼는데 이제는 Intent로 넘기고 startActivityForResult() 로 신호를 줍니다. 이 신호를 받고 변수를 넘겨받아 데이터베이스와 일하는 눔이 하단에 나오는 onActivityResult() 입니다. 이 Intent만드는 부분도 흥미롭습니다. Intent i = new Intent(this, NoteEdit.class); 에서 하는데 여기서 Intent를 받아가는 눔이 NoteEdit.class를 명시합니다.
5. onListItemClick() 도 Intent로 넘기고 startActivityForResult() 로 신호를 주는눔입니다. 이눔은 노트 수정하라는 명령이라 보면될겁니다. 이 Intent가 넘어가는 과정에서 비동기적인 프로그램간의 대화가 일어난다는것을 주시할 필요가 있습니다. 왜 이 복잡한 짓을 하는지 그 이유는 나중에 밝혀질겁니다.
2. private Cursor mNotesCursor; 로 예전에 fillData() 안에 있던 Cursor선언부 를 밖으로 빼냈습니다. 일단 filData() 는 바뀝것이 없군요.
3. 예전에는 onOptionsItemSelected() 로 선택된 메뉴아이템을 알았는데 이번에는 onMenuItemSelected() 로 아이템선텍을 잡아내는군요. 별 차이는 없어보입니다.
4. createNote()에 보면 노트 만드는 방법이 바뀝니다. 예전에는 데이터베이스로 바로 넘겼는데 이제는 Intent로 넘기고 startActivityForResult() 로 신호를 줍니다. 이 신호를 받고 변수를 넘겨받아 데이터베이스와 일하는 눔이 하단에 나오는 onActivityResult() 입니다. 이 Intent만드는 부분도 흥미롭습니다. Intent i = new Intent(this, NoteEdit.class); 에서 하는데 여기서 Intent를 받아가는 눔이 NoteEdit.class를 명시합니다.
5. onListItemClick() 도 Intent로 넘기고 startActivityForResult() 로 신호를 주는눔입니다. 이눔은 노트 수정하라는 명령이라 보면될겁니다. 이 Intent가 넘어가는 과정에서 비동기적인 프로그램간의 대화가 일어난다는것을 주시할 필요가 있습니다. 왜 이 복잡한 짓을 하는지 그 이유는 나중에 밝혀질겁니다.
.
5. NotesDbAdapter.java 는 바뀐것이 없습니다. 다행입니다.
5. NotesDbAdapter.java 는 바뀐것이 없습니다. 다행입니다.
.
6. 이제 마지막, values/strings.xml을 봅니다.
6. 이제 마지막, values/strings.xml을 봅니다.
위에 note_edit.xml 에서 title, body, confirm
myNotepadv1.java 에서 menu_delete 이 추가 될것으로 예상했었습니다.
역시 예상이 맞았습니다. 근데 edit_note 는 예상치 못한 눔이였습니다. 어디있는 눔인지 찾아봐야겠습니다. "Edit Note"라는 문구자체가 왠지 노트 수정스크린의 제목 같습니다. note_edit.xml에는 없고, NoteEdit.java에 있습니다. setContentView(R.layout.note_edit); 라고 되있는것으로 역시 노트 수정 스크린 제목이 맞습니다.
myNotepadv1.java 에서 menu_delete 이 추가 될것으로 예상했었습니다.
역시 예상이 맞았습니다. 근데 edit_note 는 예상치 못한 눔이였습니다. 어디있는 눔인지 찾아봐야겠습니다. "Edit Note"라는 문구자체가 왠지 노트 수정스크린의 제목 같습니다. note_edit.xml에는 없고, NoteEdit.java에 있습니다. setContentView(R.layout.note_edit); 라고 되있는것으로 역시 노트 수정 스크린 제목이 맞습니다.
리뷰합니다.
건들어야 할 파일이
src쪽에는
myNotepadv1 - 화면과 이야기하는 모듈입니다. - Intent 랑 노트 수정기능 땜에 잔뜩 바뀝니다.
NoteEdit.java - 노트 수정하는것 담당하는 눔입니다
NotesDbAdapter - 데이터베이스와 이야기하는 모듈입니다. - 바뀐거 없습니다.
src쪽에는
myNotepadv1 - 화면과 이야기하는 모듈입니다. - Intent 랑 노트 수정기능 땜에 잔뜩 바뀝니다.
NoteEdit.java - 노트 수정하는것 담당하는 눔입니다
NotesDbAdapter - 데이터베이스와 이야기하는 모듈입니다. - 바뀐거 없습니다.
res쪽에서 layout에
notepad_list.xml - 화면전체 모양입니다.
note_edit.xml - 노트 수정쪽 화면입니다.
notes_row.xml - 각 row의 모양입니다.
notepad_list.xml - 화면전체 모양입니다.
note_edit.xml - 노트 수정쪽 화면입니다.
notes_row.xml - 각 row의 모양입니다.
res쪽에서 values에
strings.xml - 말 그대로 화면에 뜨는 value가 들어갔습니다.
strings.xml - 말 그대로 화면에 뜨는 value가 들어갔습니다.
Run해 봅니다. 당근 에러납니다. 왜일까요
tutorial에 붙은 설명을 뒤져보니 AndroidManifest.xml 이야기가 있습니다. NoteEdit.java 를
새로만들었으니 이걸 알려주어야 한다는겁니다. 말됩니다. 에러난 부분도 노트 수정화면으로 갈때 였습니다.
eclipse 에서 AndroidManifest.xml 클릭합니다. Application tab이나오면 아래 application
Node쪽으로 가서 [Add] 버튼을 누릅니다. Activity를 선택하면 옆에 Attribute for Activity라 나옵니다. Name*
에 [Browse] 버튼을 이용 NoteEdit 를 넣습니다.
.
성공입니다.
성공입니다.
오라클자바커뮤니티에서 운영, 개발자 전문교육, 개인80%환급 오엔제이프로그래밍실무교육센터(www.onjprogramming.co.kr)
평일주간(9:30~18:30) 개강
(3/24)C#4.0,ADO.NET,Network 프로그래밍
(3/31)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(3/31)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(4/07)[기업100%환급]SQL기초에서 Schema Object까지
(4/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
평일야간(19:00~22:00) 개강
(3/27)Spring3.X, MyBatis, Hibernate실무과정
(3/27)웹퍼블리싱 마스터
(3/27)SQL초보에서실전전문가까지
(3/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/28)C#,ASP.NET마스터
(4/01)안드로이드개발자과정
(4/07)[실무프로젝트형과정]자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
주말(10:00~18:00) 개강
(3/22)닷넷실무자를위한WPF개발자과정
(3/22)안드로이드개발자과정
(3/22)C#,ASP.NET마스터
(3/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/29)Spring3.X, MyBatis, Hibernate실무과정
(3/29)웹퍼블리싱 마스터
(3/29)SQL초보에서실전전문가까지
주말저녁(18:30~22:20) 개강
(3/29)자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트
(3/29)SQL기초에서 Schema Object까지
평일주간(9:30~18:30) 개강
(3/24)C#4.0,ADO.NET,Network 프로그래밍
(3/31)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(3/31)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(4/07)[기업100%환급]SQL기초에서 Schema Object까지
(4/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
평일야간(19:00~22:00) 개강
(3/27)Spring3.X, MyBatis, Hibernate실무과정
(3/27)웹퍼블리싱 마스터
(3/27)SQL초보에서실전전문가까지
(3/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/28)C#,ASP.NET마스터
(4/01)안드로이드개발자과정
(4/07)[실무프로젝트형과정]자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
주말(10:00~18:00) 개강
(3/22)닷넷실무자를위한WPF개발자과정
(3/22)안드로이드개발자과정
(3/22)C#,ASP.NET마스터
(3/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/29)Spring3.X, MyBatis, Hibernate실무과정
(3/29)웹퍼블리싱 마스터
(3/29)SQL초보에서실전전문가까지
주말저녁(18:30~22:20) 개강
(3/29)자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트
(3/29)SQL기초에서 Schema Object까지
댓글 없음:
댓글 쓰기