[Android Studio] 예약 어플 만들기/Calendar/TimePicker/AlertDialog

andoriod studio에서 Calendar/TimePicker/AlertDialog 를 이용해 간단한 예약 어플을 만들어 보려고 한다.
진짜 예약 기능이 있는 것은 아니다. 만약 예약 기능을 구현하고 싶다면, 저기서 API 연결 등 조치를 취해야 할 것이다.
[reservation app]
일단 스크린 샷을 들고 왔는데, 화질이 어마무시하게 깨져왔다....
그래도 알아볼 수 있기를 기도한다. 만약, 안된다면 그냥 첨부된 완성 파일을 실행해보길 추천한다.
밑과 같이 캘린더에서 날짜를 고르면 Edit text에 그 날짜가 뜨게 된다.

시간을 골라도 마찬가지다.

예약 버튼을 눌렀을 시 (와...화질 다시 한 번 죄송...)

alertdialog창에서 예약을 선택했을 경우

alertdialog창에서 취소를 선택했을 경우

menu xml이 따로 있다.


아니...Tistory 양반..... 이게 무슨 일이오....... 분명히 word에서는 화질 좋았던 스크린 캡쳐 사진들인데...... 복붙하니까 화질이 바로 이렇게 뭉개져 버리네.... 이미지 프로세싱 배우는 중이니 이 원인을 한 번 파악해보도록 하겠수...(언젠가는...)

Main Activity]
package com.example.reservationapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.TimePicker;
import android.util.Log;
import android.widget.Toast;
import java.sql.Time;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
Calendar c = Calendar.getInstance(); //초기화하는 부분
int Year= c.get(Calendar.YEAR);
int Month = c.get(Calendar.MONTH);
int DayOfMonth = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int min = c.get(Calendar.MINUTE);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CalendarView cal = (CalendarView)findViewById(R.id.calendarView); //Calendar를 변경시키기 위해 객체 생성
cal.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
//Calendar에 변화가 생기면 call. 변화된 정보(day,year,month)를 text의 내용으로 삽입.
EditText date = (EditText)findViewById(R.id.textDate);
date.setText(year+"/"+(month+1)+"/"+dayOfMonth);
Year = year; //global variable에 변경된 정보 저장
Month = month;
DayOfMonth = dayOfMonth;
}
});
TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker); //Time을 선택 및 변경시키기 위해 객체 생성
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
//TimePicker에 변화가 생기면 call. 변화된 정보(시간, 분)를 text의 내용으로 삽입.
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
EditText time = (EditText)findViewById(R.id.textTime);
time.setText(hourOfDay+":"+minute);
hour = hourOfDay; //global variable에 변경된 정보 저장
min = minute;
}
});
Button button = (Button) findViewById(R.id.Reserve) ; //for 예약 버튼 기능 구현
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) { //예약 버튼 눌러졌을 때 AlertDialog뜨게 만들기
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
alertDialogBuilder.setMessage(Year+"년"+(Month+1)+"월"+DayOfMonth+"일"+hour+":"+min+"분에 예약하시겠습니까?"); //global variable에 미리 저장해놓은 것들 불러옴.
alertDialogBuilder.setPositiveButton("예약",
new DialogInterface.OnClickListener() { //AlertDialog창에서 오른쪽 선택지로 설정된 '예약'이 선택되었을 경우
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(MainActivity.this,
Year+"년"+(Month+1)+"월"+DayOfMonth+"일"+hour+":"+min+"분에 예약되었습니다.",Toast.LENGTH_LONG).show();
}
});
alertDialogBuilder.setNegativeButton("취소",new DialogInterface.OnClickListener() {
//AlertDialog창에서 왼쪽 선택지로 설정된 '취소'가 선택되었을 경우
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,
"예약이 취소되었습니다.",Toast.LENGTH_LONG).show();
//finish();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
});
}
//Menu 옵션 (Clear) 구현
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.reservemenu,menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
if(item.getItemId()==R.id.clear){
//초기화
final Calendar c = Calendar.getInstance();
CalendarView cal = (CalendarView)findViewById(R.id.calendarView);
TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker);
cal.setDate(c.getTimeInMillis());
EditText date = (EditText)findViewById(R.id.textDate);
date.setText(c.get(Calendar.YEAR)+"/"+(c.get(Calendar.MONTH)+1)+"/"+c.get(Calendar.DAY_OF_MONTH));
Year = c.get(Calendar.YEAR);
Month = c.get(Calendar.MONTH);
DayOfMonth = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int min = c.get(Calendar.MINUTE);
timePicker.setHour(hour);
timePicker.setMinute(min);
}
return true;
}
}
layout->acivity_main.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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="144dp"
android:layout_height="20dp"
android:text="@string/title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<CalendarView
android:id="@+id/calendarView"
android:layout_width="374dp"
android:layout_height="322dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.567"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.0" />
<TimePicker
android:id="@+id/timePicker"
android:layout_width="245dp"
android:layout_height="125dp"
android:timePickerMode="spinner"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/calendarView"
app:layout_constraintVertical_bias="0.144" />
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="424dp"
android:layout_height="75dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.525"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/timePicker"
app:layout_constraintVertical_bias="0.275">
<TextView
android:id="@+id/textView2"
android:layout_width="36dp"
android:layout_height="44dp"
android:layout_weight="1"
android:text="@string/reserve_date" />
<EditText
android:id="@+id/textDate"
android:layout_width="122dp"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/textTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<Button
android:id="@+id/Reserve"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/reserve"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
app:layout_constraintVertical_bias="0.492" />
</androidx.constraintlayout.widget.ConstraintLayout>
menu -> reservemenu.xml ]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/clear"
android:title="Clear" />
</menu>
이 외의 Strings.xml 같은 values는 적당히 저장해놓음!
이것은 첨부된 코드로 살펴보시길.
그럼 오늘도 행복한 하루 보내시길. 또 오겠음.
+ 파일 크기가 커서 첨부를 못하는 관계로, 드라이브 링크 남기겠음. 번거로우시겠지만 필요하신 분들은 봐주시길.
drive.google.com/drive/folders/1lmUWgYplePAH9nWsfG6EYjvGjUR9cgm9?usp=sharing