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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Chronometer
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/chrono"
android:textSize="30sp"
android:gravity="center"
android:format="예약에 걸린 시간 %s"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnStart"
android:text="예약시작"
android:textSize="20sp" />
</LinearLayout>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/rGroup">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rbCalendar"
android:text="날짜 설정(캘린더뷰)"
android:textSize="20sp"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rbTime"
android:text="시간 설정"
android:textSize="20sp"/>
</RadioGroup>
<!-- 한 공간에 여러 위젯을 겹쳐서 담기 위해 FrameLayout 사용 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"><!-- 높이를 최대로 키우되 아래쪽 위젯 크기만큼은 남겨둠 -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CalendarView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/calendarView" />
<TimePicker
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/timePicker"
android:timePickerMode="spinner" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnOk"
android:text="예약완료"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvYear"
android:text="0000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="년 " />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvMonth"
android:text="00" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="월 " />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvDay"
android:text="00" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="일 " />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvHour"
android:text="00" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="시 " />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvMinute"
android:text="00" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="분 예약됨" />
</LinearLayout>
</LinearLayout>
Main Class
package com.example.ch6test;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.Chronometer;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
Button btnStart, btnOk;
RadioGroup rGroup;
RadioButton rbCalendar, rbTime;
TextView tvYear, tvMonth, tvDay, tvHour, tvMinute;
int selectedYear, selectedMonth, selectedDay; // CalendarView 날짜 출력 시 정보를 저장할 변수
boolean isChronoStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("예약하기");
final Chronometer chrono = findViewById(R.id.chrono);
final CalendarView calendarView = findViewById(R.id.calendarView);
final TimePicker timePicker = findViewById(R.id.timePicker);
btnStart = findViewById(R.id.btnStart);
btnOk = findViewById(R.id.btnOk);
rGroup = findViewById(R.id.rGroup);
rbCalendar = findViewById(R.id.rbCalendar);
rbTime = findViewById(R.id.rbTime);
// 텍스트뷰 (연, 월, 일, 시, 분)
tvYear = findViewById(R.id.tvYear);
tvMonth = findViewById(R.id.tvMonth);
tvDay = findViewById(R.id.tvDay);
tvHour = findViewById(R.id.tvHour);
tvMinute = findViewById(R.id.tvMinute);
// 숨김 처리
rGroup.setVisibility(View.INVISIBLE);
calendarView.setVisibility(View.INVISIBLE);
timePicker.setVisibility(View.INVISIBLE);
// 크로노미터 클릭 시 동작
chrono.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 크로노미터 상태가 저장된 변수 isChronoStart 판별
if(!isChronoStart) {
chrono.setBase(SystemClock.elapsedRealtime());
chrono.setTextColor(Color.RED);
chrono.start();
isChronoStart = true;
} else {
chrono.setTextColor(Color.BLUE);
chrono.stop();
isChronoStart = false;
}
}
});
// 예약 시작 버튼 클릭 시 크로노미터 동작
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(btnStart.getText().equals("예약시작")) {
chrono.setBase(SystemClock.elapsedRealtime()); // 타이머 초기화
chrono.start();
chrono.setTextColor(Color.RED);
// RadioGroup 숨김 처리 해제
rGroup.setVisibility(View.VISIBLE);
// CalendarView와 TimePicker의 정보 초기화(현재 날짜 및 시각으로 설정)
calendarView.setDate(System.currentTimeMillis());
timePicker.setCurrentHour(new Date().getHours());
timePicker.setCurrentMinute(new Date().getMinutes());
}
}
});
// CalendarView 날짜 변경 시 동작하는 이벤트 처리
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
// 선택된 날짜 정보가 파라미터로 전달됨 => 각 변수에 저장
selectedYear = year;
selectedMonth = month + 1;
selectedDay = dayOfMonth;
Toast.makeText(MainActivity.this, selectedYear + "년 " + selectedMonth + "월 " + selectedDay + "일", Toast.LENGTH_SHORT).show();
}
});
// 예약완료 버튼 클릭 시 크로노미터 정지
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chrono.stop();
chrono.setTextColor(Color.BLUE);
// 날짜 정보가 선택되지 않은 경우 알림 출력 후 작업 수행하지 않음
if(selectedYear == 0 || selectedMonth == 0 || selectedDay == 0) {
Toast.makeText(MainActivity.this, "날짜 선택 필수입니다!", Toast.LENGTH_SHORT).show();
calendarView.setVisibility(View.VISIBLE);
timePicker.setVisibility(View.INVISIBLE);
rbCalendar.setChecked(true);
rbTime.setChecked(false);
return;
}
// 선택된 날짜 및 시각 정보를 TextView에 출력
tvYear.setText(selectedYear + ""); // int -> String 변환 필요
tvMonth.setText(selectedMonth + "");
tvDay.setText(selectedDay + "");
tvHour.setText(timePicker.getCurrentHour()); // API Level 23 이상부터는 getHour() 사용
tvMinute.setText(timePicker.getCurrentMinute());
}
});
rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// 파라미터로 전달된 checkId와 RadioButton ID 값 비교
switch(checkedId) {
case R.id.rbCalendar: // 날짜설정 선택 시 CalendarView 표시 및 TimePicker 숨김
calendarView.setVisibility(View.VISIBLE);
timePicker.setVisibility(View.INVISIBLE);
break;
case R.id.rbTime: // 시간설정 선택 시 TimePicker 표시 및 CalendarView 표시
timePicker.setVisibility(View.VISIBLE);
calendarView.setVisibility(View.INVISIBLE);
}
}
});
}
}
'BackEnd > Android' 카테고리의 다른 글
기타 위젯 (0) | 2020.06.17 |
---|---|
고급 위젯 - 날짜/시간 관련 (0) | 2020.06.16 |
그리드 레이아웃으로 계산기 구현하기 (0) | 2020.06.16 |
for문의 초기변수를 내부에서 사용하는 방법 (0) | 2020.06.16 |
레이아웃 (0) | 2020.06.12 |