본문 바로가기

BackEnd/Android

간단한 예약 프로그램 구현하기

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