1 . 과제 ( 매주 일요일 17 : 00 마감 ) 322 쪽 직접 풀 어 보 기 8 - 1 main . xml 문서 LinearLayout 사용 . android : orientation =" vertical " 으로 레이아웃 의 방향 을 수직 으로 지정 해 준다 . android : layout _ width =" match _ parent " 와 layout _ height =" match _ parent " 로 폭 과 높이 를 지정 해 준다 . 데이트 피커 를 생성 한다 . 위젯 id 는 dataPicker 1 로 . android : layout _ width =" match _ parent " 로 폭 을 지정 하 고 , height =" wrap _ content " 로 높이 를 지정 한다 . android : calendarViewShown =" false " 를 통해 간단 하 게 보이 도록 설정 한다 . 에디터 텍스트 를 생성 한다 . 위젯 의 id 는 edtDiary 로 . android : layout _ width =" match _ parent " 로 폭 을 지정 하 고 , height =" wrap _ content " 로 높이 를 지정 한다 . background 배경 색은 # ff 7098 로 지정 해 주 었 다 . lines 로 8 행 으로 설정 한다 . 버튼 을 생성 한다 . 위젯 의 id 는 btnWrite 로 . android : layout _ width =" match _ parent " 로 폭 을 지정 하 고 , height =" wrap _ content " 로 높이 를 지정 한다 . android : enabled =" false " 를 통해 초기 에 버튼 을 disable 시킨다 . android : text =" Button " 으로 지정 한다 . LinearLayout 을 닫 아 준다 . Practice 8 _ 1 Activity . java 문서 main . xml 문서 에서 생성 한 3 개 의 위젯 에 대응 할 위젯 변수 3 개 를 만든 다 . 그리고 파일 이름 을 지정 할 문자열 변수 를 하나 만든다 . String fileName 이것 이 다 . 출력 화면 실행 시 보일 상단 부분 의 문자 를 setTitle 을 통해 " 간단 일기장 " 이라고 지정 한다 . 위 에서 만든 위젯 변수 3 개 에 main . xml 의 위젯 을 대입 한다 . 데이트 피커 를 설정 한다 . Calendar 클래스 를 이용 해 현재 날짜 의 년 / 월 / 일 을 구한 후 에 데이트 피커 를 초기 화 시킨다 . 출력 화면 을 실행 시 해당 날짜 에 메모 가 되 어 있 다면 메모 를 불러낼 수 있 도록 readDiary ( ) 메소드 를 작성 한다 . 데이트 피커 를 init ( ) 메소드 로 초기 화 한다 . 파라미터 는 년 , 월 , 일 과 리스 너 로 설정 하 면 된다 . 리스 너 는 날짜 가 변경 되 었 을 때 동작 하 는 DatePicker . OnDateChangedLisener ( ) 를 사용 한다 . 리스 너 의 오버 라이드 된 메소드 OnDateChanged ( ) 를 완성 한다 . 이 는 데이트 피커 의 날짜 가 변경 되 면 데이트 피커 에 설정 된 년 ( year ) , 월 ( monthOfYear ) , 일 ( dayOfMonth ) 을 사용 할 수 있 다 . 그리고 현재 날짜 에 해당 하 는 파일 이름 을 년 _ 월 _ 일 . txt 로 만들 어 준다 . 이 는 위 의 소스 에서 fileName 에 해당 된다 . 후 에 String str = readDiary ( fileName ) ; 을 통해 현재 날짜 의 일기 파일 을 읽 어 들인다 . readDiary ( ) 메소드 는 onCreate ( ) 메소드 밖 에 형태 를 만들 어 놓 는다 . readDiary ( ) 는 현재 날짜 의 일기 내용 을 반환 하 거나 , 만약 현재 날짜 에 일기 가 없 다면 null 을 반환 하 도록 한다 . 변경 된 날짜 에 해당 하 는 일기 파일 ( 년 _ 월 _ 일 . txt ) 의 내용 을 edtDiary . setText ( str ) ; 와 btnWrite . setEnable ( true ) ; 을 통해 에디터 텍스트 에 출력 . readDiary ( ) 에 의해 또는 으로 보이 게 된다 . 에디트 텍스트 의 내용 을 새로 입력 하 거나 기존 의 내용 을 수정 한 후 에 클릭 하 면 에디트 텍스트 의 내용 이 현재 날짜 의 파일 ( 년 _ 월 _ 일 . txt ) 로 저장 . 일기 파일 ( 년 _ 월 _ 일 . txt ) 을 FileOutputStream outFs = openFileOutput ( fileName , Context . MODE _ WORLD _ WRITEABLE ) ; DMF XHDGO 쓰 기 모드 로 연다 . 에디트 텍스트 의 내용 을 일기 파일 에 byte [ ] 형 으로 쓰 고 , outFs . close ( ) 로 파일 을 닫 는다 . 파일 은 꼭 닫 아 주 어야 한다 . 파일 을 연 후 에 close ( ) 닫 아 주 지 않 으면 파일 이 깨지 게 된다 . Toast 메시지 를 사용 해 저장 된 파일 이름 을 토스트 메시지 로 출력 한다 . 이 는 dp . init ( ) 에 있 었 던 현재 날짜 의 파일 ( 년 _ 월 _ 일 . txt ) 을 읽 어 일기 의 내용 을 반환 하 는 readDiary ( ) 메소드 이 다 . 파일 이름 ( 년 _ 월 _ 일 . txt ) 을 파라미터 로 받 아 온다 . String diaryStr = null ; 과 FileInputStream inFs ; 를 통해 읽 어 온 일기 를 저장 할 문자열 변수 와 입력 파일 스트림 변수 를 선언 한다 . 이제 일기 파일 을 열 어 입력 파일 스트림 에 저장 한다 . 파일 이 없 다면 오류 가 발생 해 catch ( ) 이후 의 내용 이 실행 되 는 것 이 다 . 후 에 byte [ ] 형 변수 를 선언 하 고 inFs . read ( txt ) ; 로 파일 의 내용 을 txt 에 읽 어 들인다 . inFs . close ( ) 로 꼭 파일 을 닫 아 준다 . 만약 openFileInput ( ) 을 사용 하 고 즉 , 파일 을 연 후 에 close ( ) 닫 아 주 지 않 으면 파일 이 깨지 게 된다 . 이 단계 는 무척 중요 하 다 . 이제 읽 어 온 txt 를 문자열 로 변경 한다 . 그리고 . trim ( ) 메소드 로 앞뒤 의 공백 을 제거 한다 . 그리고 dairyStr = ( new String ( txt ) ) . trim ( ) ; 로 반환 할 diaryStr 변수 에 대입 한다 . btnWrite . setText ( " 수정 하 기 ") 로 현재 는 일기 가 있 는 상태 이 므로 화면 의 버튼 글자 를 " 수정 하 기 로 " 변경 한다 . 만약 파일 이 없 어 오류 가 발생 하 면 위 에서 말 했 듯이 catch ( ) 이후 의 내용 이 실행 되 는 데 화면 에 일기 를 작성 할 수 있 는 에디터 텍스트 화면 에 Hint 로 " 일기 없 음 " 이 보여 지 고 버튼 은 " 새로 저장 " 이 라 변경 된다 . return diaryStr ; 로 일기 파일 이 있 다면 일기 의 내용 이 반환 되 게 하 고 없 다면 null 값 이 반환 되 게 한다 . 출력 화면 329 쪽 직접 풀 어 보 기 8 - 2 공유 하 기 글 요소