728x90
이번 포스팅에선 자바를 사용해 달력을 띄우고, 일별로 일정을 저장할 수 있는 방법에 대해 포스팅하겠습니다.
코틀린으로 만드는 방법에 대해선 아래 포스팅을 참고해 주세요.
먼저 메인 화면을 만들어줍니다. 달력이 있고 일자를 클릭하면 밑에 내가 어떤 날짜를 선택했는지 텍스트뷰로 보여주며, 일정을 추가할 editText와 저장할 버튼을 만들겠습니다.
<?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: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
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] 안드로이드 전광판 만들기 (0) | 2021.06.22 |
---|---|
[Java][Android] MLkit를 이용한 얼굴 탐지 (0) | 2021.06.19 |
[JAVA][Android] intent를 사용하여 이미지 보내기 (2) | 2021.06.16 |
[JAVA][Android] 안드로이드 OCR 기능 만들기 (4) | 2021.06.13 |
[JAVA][Android] 라이브 방송 화면 만들기 (0) | 2021.06.11 |