일정 관리 앱 만들기 - iljeong gwanli aeb mandeulgi

이번 포스팅에선 자바를 사용해 달력을 띄우고, 일별로 일정을 저장할 수 있는 방법에 대해 포스팅하겠습니다.

코틀린으로 만드는 방법에 대해선 아래 포스팅을 참고해 주세요.

stickode.tistory.com/139

먼저 메인 화면을 만들어줍니다. 달력이 있고 일자를 클릭하면 밑에 내가 어떤 날짜를 선택했는지 텍스트뷰로 보여주며, 일정을 추가할 editText와 저장할 버튼을 만들겠습니다.

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="//schemas.android.com/apk/res/android" xmlns:app="//schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <CalendarView android:id="@+id/calendarView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.488" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView3" /> <TextView android:id="@+id/diaryTextView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:gravity="center" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/calendarView" /> <EditText android:id="@+id/contextEditText" android:layout_width="0dp" android:layout_height="116dp" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:ems="10" android:hint="내용을 입력하세요." android:inputType="textMultiLine" android:visibility="invisible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/diaryTextView" /> <TextView android:id="@+id/textView2" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="@+id/contextEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/contextEditText" app:layout_constraintTop_toTopOf="@+id/contextEditText" /> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_height="wrap_content" android:visibility="invisible" 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:id="@+id/save_Btn" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="20dp" android:text="저장" android:visibility="invisible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/contextEditText" /> <Button android:id="@+id/cha_Btn" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:text="수정" android:visibility="invisible" app:layout_constraintBaseline_toBaselineOf="@+id/save_Btn" app:layout_constraintEnd_toStartOf="@+id/del_Btn" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/del_Btn" android:layout_width="176dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:text="삭제" android:visibility="invisible" app:layout_constraintBaseline_toBaselineOf="@+id/cha_Btn" app:layout_constraintEnd_toEndOf="@+id/save_Btn"/> </androidx.constraintlayout.widget.ConstraintLayout>

다음으로 메인 액티비티의 자바 파일을 작성하겠습니다.

import android.os.Bundle; import android.widget.Button; import android.widget.CalendarView; import android.widget.EditText; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { public String readDay = 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); } }

화면의 기본 틀은 만들었으니 이제 하나씩 기능을 추가해 보겠습니다.

일자를 클릭하면 달력 밑에 editText가 나오게 한 다음, 그곳에 일정을 입력할 수 있고 저장 버튼을 누르면 해당 일자에 내가 입력한 일정이 저장되도록 하겠습니다.

일자를 클릭하는 것은 캘린더뷰를 클릭하는 것이기 때문에, 캘린더뷰에 아래 처리를 해주면 됩니다.

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); } });

그리고 저장 버튼의 클릭 리스너를 아래와 같이 정의해줍니다.

save_Btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { saveDiary(readDay); 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); } });

다음으로 삭제 버튼의 리스너도 만들어줍니다.

@SuppressLint("WrongConstant") public void removeDiary(String readDay) { FileOutputStream fos; try { fos = openFileOutput(readDay, MODE_NO_LOCALIZED_COLLATORS); String content = ""; fos.write((content).getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }

최종 코드는 아래와 같습니다.

import android.annotation.SuppressLint; 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 androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import java.io.FileInputStream; import java.io.FileOutputStream; public class MainActivity extends AppCompatActivity { public String readDay = 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); 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); } }); save_Btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { saveDiary(readDay); 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) { readDay = "" + cYear + "-" + (cMonth + 1) + "" + "-" + cDay + ".txt"; FileInputStream fis; try { fis = openFileInput(readDay); 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(readDay); } }); 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; 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; try { fos = openFileOutput(readDay, MODE_NO_LOCALIZED_COLLATORS); String content = contextEditText.getText().toString(); fos.write((content).getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } } }

앱을 빌드해서 확인하면 아래와 같이 작동하는 걸 볼 수 있습니다.

이 포스팅에 사용된 코드는 아래 링크에서 확인하실 수 있습니다.

stickode.com/detail.html?no=2169

스틱코드

stickode.com

Toplist

최신 우편물

태그