앱 개발 공부방

안드로이드 스튜디오-calendarview를 사용하고 일정을 저장하는 기능 본문

Android-java

안드로이드 스튜디오-calendarview를 사용하고 일정을 저장하는 기능

춘행이 2020. 4. 29. 14:06
728x90

calendarview를 사용하여 달력을 만들고 특정 날짜에 일정을 openFileInput, openFileOutput으로 저장하는 기능을 사용하도록 하겠습니다

 

먼저 저는 로그인을 하여 그 아이디에 따라 일정을 저장하도록 하여서 로그인 및 회원가입 화면도 알고 싶으시면 아래 글을 보고 만들어 주시면 됩니다.

https://cpcp127.tistory.com/9

 

안드로이드 스튜디오-로그인 회원가입 만들기

어플들을 쓰면 대부분이 회원가입과 로그인이 있습니다 여러 방법이 있지만 여기서는 php와 mysql을 사용하여 DB와 연동시켜 만들도록 하겠습니다 먼저 XML부터 만들겠습니다 activity_login.xml(로그인 화면 xml)..

cpcp127.tistory.com

https://cpcp127.tistory.com/10

 

안드로이드 스튜디오-로그인 회원가입2

저번 글에서 DB나 PHP구문에 대해서 했다면 이번에는 안드로이드 스튜디오로 연결해서 구현하겠습니다 처음으로 인터넷을 사용하기 위해 아래 글을 추가해줍니다 cpcp127.tistory.com

 

화면은 이런 식으로 구성되고 현재 보이진 않지만 날짜를 누르면 선택한 날짜, 일정을 쓰거나 보일 text, 수정, 저장, 삭제 기능 버튼 및 textView를 보이도록 하였습니다.

 

xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >


    <CalendarView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/calendarView"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginLeft="8dp" android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp" android:layout_marginRight="8dp"
        app:layout_constraintHorizontal_bias="0.488" android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/textView3"/>
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity= "center"
        android:id="@+id/diaryTextView" android:layout_marginTop="16dp"
        app:layout_constraintTop_toBottomOf="@+id/calendarView" app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp" android:layout_marginRight="8dp"
        app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp" android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
    <EditText
        android:layout_width="0dp"
        android:layout_height="116dp"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/contextEditText"
        app:layout_constraintTop_toBottomOf="@+id/diaryTextView" android:layout_marginTop="16dp"
        android:hint="내용을 입력하세요." android:layout_marginEnd="8dp" app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginRight="8dp" android:layout_marginStart="8dp"
        app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="8dp"
        android:visibility="invisible"/>

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:id="@+id/textView2"
        app:layout_constraintTop_toTopOf="@+id/contextEditText"
        app:layout_constraintBottom_toBottomOf="@+id/contextEditText" app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp" android:layout_marginRight="8dp"
        app:layout_constraintStart_toStartOf="@+id/contextEditText" android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp" android:visibility="invisible"/>

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:gravity="center"
        android:text="달력일기장"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:textColor="#9E28B3"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:text="저장"
        android:layout_width="0dp"
        android:layout_marginBottom="20dp"
        android:layout_height="wrap_content"
        android:id="@+id/save_Btn" android:layout_marginTop="16dp"
        app:layout_constraintTop_toBottomOf="@+id/contextEditText" app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp" android:layout_marginRight="8dp"
        app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp" android:visibility="invisible"/>




    <Button
        android:text="수정"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:id="@+id/cha_Btn"
        app:layout_constraintBaseline_toBaselineOf="@+id/save_Btn" app:layout_constraintStart_toStartOf="parent"
        android:layout_marginLeft="8dp" android:layout_marginStart="8dp"
        app:layout_constraintEnd_toStartOf="@+id/del_Btn" android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp" android:visibility="invisible"/>
    <Button
        android:text="삭제"
        android:layout_width="176dp"
        android:layout_height="wrap_content"
        android:id="@+id/del_Btn"
        app:layout_constraintBaseline_toBaselineOf="@+id/cha_Btn" app:layout_constraintEnd_toEndOf="@+id/save_Btn"
        android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:visibility="invisible"></Button>


</androidx.constraintlayout.widget.ConstraintLayout>

이제 메인 문으로 가기 전에 openFileInput, openFileOutput에 대해 간단히 설명하겠습니다.

 

안드로이드 기기에서 자료를 저장하는 방법은 크게 4가지가 있습니다.

내부 저장장치, 외부 저장장치, db에 저장, sharedpreferences가 있는데 openFileInput, openFileOutput은 내부 저장장치를 사용하여 저장합니다.

 

자바의 파일 입출력 스트림을 사용하며, openFileInput, openFileOutput을 사용하여 안드로이드 내부 저장장치에 파일을 생성하여 쓰고 읽기를 하는 방식입니다.

 

openFileInput : 하위 디렉터리에 있는 응용프로그램 파일을 읽기 모드로 오픈

openFileOutput : 하위 디렉터리에 있는 응용프로그램 파일을 쓰기 모드로 열거나 생성

 

MainActivity. java

package com.example.project5;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.TextView;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

    public String fname=null;
    public String str=null;
    public CalendarView calendarView;
    public Button cha_Btn,del_Btn,save_Btn;
    public TextView diaryTextView,textView2,textView3;
    public EditText contextEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        calendarView=findViewById(R.id.calendarView);
        diaryTextView=findViewById(R.id.diaryTextView);
        save_Btn=findViewById(R.id.save_Btn);
        del_Btn=findViewById(R.id.del_Btn);
        cha_Btn=findViewById(R.id.cha_Btn);
        textView2=findViewById(R.id.textView2);
        textView3=findViewById(R.id.textView3);
        contextEditText=findViewById(R.id.contextEditText);
        //로그인 및 회원가입 엑티비티에서 이름을 받아옴
        Intent intent=getIntent();
        String name=intent.getStringExtra("userName");
        final String userID=intent.getStringExtra("userID");
        textView3.setText(name+"님의 달력 일기장");

        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
                diaryTextView.setVisibility(View.VISIBLE);
                save_Btn.setVisibility(View.VISIBLE);
                contextEditText.setVisibility(View.VISIBLE);
                textView2.setVisibility(View.INVISIBLE);
                cha_Btn.setVisibility(View.INVISIBLE);
                del_Btn.setVisibility(View.INVISIBLE);
                diaryTextView.setText(String.format("%d / %d / %d",year,month+1,dayOfMonth));
                contextEditText.setText("");
                checkDay(year,month,dayOfMonth,userID);
            }
        });
        save_Btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                saveDiary(fname);
                str=contextEditText.getText().toString();
                textView2.setText(str);
                save_Btn.setVisibility(View.INVISIBLE);
                cha_Btn.setVisibility(View.VISIBLE);
                del_Btn.setVisibility(View.VISIBLE);
                contextEditText.setVisibility(View.INVISIBLE);
                textView2.setVisibility(View.VISIBLE);

            }
        });
    }

    public void  checkDay(int cYear,int cMonth,int cDay,String userID){
        fname=""+userID+cYear+"-"+(cMonth+1)+""+"-"+cDay+".txt";//저장할 파일 이름설정
        FileInputStream fis=null;//FileStream fis 변수

        try{
            fis=openFileInput(fname);

            byte[] fileData=new byte[fis.available()];
            fis.read(fileData);
            fis.close();

            str=new String(fileData);

            contextEditText.setVisibility(View.INVISIBLE);
            textView2.setVisibility(View.VISIBLE);
            textView2.setText(str);

            save_Btn.setVisibility(View.INVISIBLE);
            cha_Btn.setVisibility(View.VISIBLE);
            del_Btn.setVisibility(View.VISIBLE);

            cha_Btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    contextEditText.setVisibility(View.VISIBLE);
                    textView2.setVisibility(View.INVISIBLE);
                    contextEditText.setText(str);

                    save_Btn.setVisibility(View.VISIBLE);
                    cha_Btn.setVisibility(View.INVISIBLE);
                    del_Btn.setVisibility(View.INVISIBLE);
                    textView2.setText(contextEditText.getText());
                }

            });
            del_Btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    textView2.setVisibility(View.INVISIBLE);
                    contextEditText.setText("");
                    contextEditText.setVisibility(View.VISIBLE);
                    save_Btn.setVisibility(View.VISIBLE);
                    cha_Btn.setVisibility(View.INVISIBLE);
                    del_Btn.setVisibility(View.INVISIBLE);
                    removeDiary(fname);
                }
            });
            if(textView2.getText()==null){
                textView2.setVisibility(View.INVISIBLE);
                diaryTextView.setVisibility(View.VISIBLE);
                save_Btn.setVisibility(View.VISIBLE);
                cha_Btn.setVisibility(View.INVISIBLE);
                del_Btn.setVisibility(View.INVISIBLE);
                contextEditText.setVisibility(View.VISIBLE);
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @SuppressLint("WrongConstant")
    public void removeDiary(String readDay){
        FileOutputStream fos=null;

        try{
            fos=openFileOutput(readDay,MODE_NO_LOCALIZED_COLLATORS);
            String content="";
            fos.write((content).getBytes());
            fos.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @SuppressLint("WrongConstant")
    public void saveDiary(String readDay){
        FileOutputStream fos=null;

        try{
            fos=openFileOutput(readDay,MODE_NO_LOCALIZED_COLLATORS);
            String content=contextEditText.getText().toString();
            fos.write((content).getBytes());
            fos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

editText에 자바라 쓰고 저장을 누르면

사진처럼 2020/4/29.txt 파일에 자바. 가 저장되어 29일을 클릭하면 저장된 txt 파일이 출력됩니다.

 

*참고(코틀린을 자바로 변환하여 사용하였습니다)

https://blog.naver.com/PostView.nhn?blogId=oper4062&logNo=221446757338&parentCategoryNo=&categoryNo=6&viewDate=&isShowPopularPosts=true&from=search

 

Android Studio 코틀린(Kotlin) 7일차 간단한 달력 일기장 만들어보기.

금요일부터 오늘까지 간단한 달력 일기장을 만들어 보았다. 기능 추가로 인한 계속적인 디자인 추가와 정상...

blog.naver.com

 

728x90
Comments