본문 바로가기

Dev/안드로이드

안드로이드 프로그래밍 8장 실습 8-1

728x90
반응형
Android Studio를 활용한 안드로이드 프로그래밍
국내도서
저자 : 우재남,박길식
출판 : 한빛아카데미 2020.01.08
상세보기

한빛아카데미 IT COOKBOOK 276 Android Studio를 활용한 안드로이드 프로그래밍 5판 p.327

 

간단 일기장 앱 만들기

 

날짜를 선택했을 때 그 날짜의 일기가 없으면 새로 쓰고, 있으면 일기를 보여주는 앱을 만들자.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <DatePicker
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/datePicker1"
        android:datePickerMode="spinner"
        android:calendarViewShown="false" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edtDiary"
        android:background="#00ff00"
        android:lines="8" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnWrite"
        android:enabled="false"
        android:text="Button" />
</LinearLayout>

날짜를 선택할 수 있는 DatePicker와 일기장 내용을 작성할 EditText, 그리고 저장할 버튼을 하나 만들었습니다.

 

책의 보기처럼 DatePicker가 나오도록 spinner 속성도 추가했습니다.

 

activity_main.xml 구동 화면

그리고 버튼이 초기에 동작하지 않도록 enabled 속성을 false로 설정했습니다.

 

MainActivity.java

package com.cookandroid.project8_1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    DatePicker dp;
    EditText edtDiary;
    Button btnWrite;
    String fileName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("간단 일기장");

        dp = (DatePicker) findViewById(R.id.datePicker1);
        edtDiary = (EditText) findViewById(R.id.edtDiary);
        btnWrite = (Button) findViewById(R.id.btnWrite);

        Calendar cal= Calendar.getInstance();
        int cYear = cal.get(Calendar.YEAR);
        int cMonth = cal.get(Calendar.MONTH);
        int cDay = cal.get(Calendar.DAY_OF_MONTH);

        dp.init(cYear, cMonth, cDay, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                fileName = Integer.toString(year) + "_" + Integer.toString(monthOfYear + 1) + "_" + Integer.toString(dayOfMonth) + ".txt";
                String str = readDiary(fileName);
                edtDiary.setText(str);
                btnWrite.setEnabled(true);
            }
        });

        btnWrite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    FileOutputStream outFs = openFileOutput(fileName, Context.MODE_PRIVATE);
                    String str = edtDiary.getText().toString();
                    outFs.write(str.getBytes());
                    outFs.close();
                    Toast.makeText(getApplicationContext(), fileName+" 이 저장됨", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                }
            }
        });
    }

    String readDiary (String fName){
        String diaryStr = null;
        FileInputStream inFs;
        try {
            inFs = openFileInput(fName);
            byte[] txt = new byte[500];
            inFs.read(txt);
            inFs.close();
            diaryStr = (new String(txt)).trim();
            btnWrite.setText("수정하기");
        } catch (IOException e) {
            edtDiary.setHint("일기 없음");
            btnWrite.setText("새로 저장");
        }
        return diaryStr;
    }
}

 

일기 파일의 제목을 날짜로 저장하기 위해서 onDateChanged 안에 fileName을 지정해주었습니다.

 

그러고 나서 데이트피커를 init()으로 초기화했습니다.

 

readDiary() method는 해당 날짜의 파일을 읽어 일기의 내용을 반환하는 역할입니다.

 

btnWrite의 setOnClickListener로 일기를 저장하고 저장된 파일 이름을 토스트 메시지로 출력하게 됩니다.

 

 

Android Studio AVD 실행 결과

application build 결과

보시는 것처럼 이전에 저장한 일기가 있으면 수정하기 버튼으로 바뀌게 되고

저장한 내용이 없으면 저장하기 버튼으로 출력됩니다.

728x90
반응형

"); wcs_do();