프로젝트

[java,안드로이드 스튜디오] 날짜와 시간 예약하는 캘린더

기계학습점쟁이 2023. 12. 8. 16:22

activity_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"
    tools:layout_editor_absoluteX="2dp"
    tools:layout_editor_absoluteY="1dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        tools:layout_editor_absoluteX="2dp"
        tools:layout_editor_absoluteY="1dp">

        <TextView
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="SIgn In"
            android:textSize="34sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.15" />

        <EditText
            android:id="@+id/editTextTextPassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPassword"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.55"
            tools:layout_editor_absoluteX="102dp" />

        <EditText
            android:id="@+id/editTextTextEmailAddress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textEmailAddress"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.42"
            tools:layout_editor_absoluteX="101dp" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Email"
            app:layout_constraintStart_toStartOf="@+id/editTextTextEmailAddress"
            tools:layout_editor_absoluteY="269dp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="password"
            app:layout_constraintStart_toStartOf="@+id/editTextTextPassword"
            tools:layout_editor_absoluteY="359dp" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="신규가입"
            android:textSize="12sp"
            tools:layout_editor_absoluteX="159dp"
            tools:layout_editor_absoluteY="544dp" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <TextView
        android:id="@+id/login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SIgn In"
        android:textSize="34sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.15" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="로그인하기"
        tools:layout_editor_absoluteX="148dp"
        tools:layout_editor_absoluteY="475dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_calander.xml의 내용은 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="예약시작"
            android:textColor="#FFFFFF"
            android:background="#000000"
            android:textSize="18dp" />

        <Chronometer
            android:id="@+id/chronmeter"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:format="예약에 걸린 시간 -%s"
            android:gravity="center"
            android:textSize="20dp" />
    </LinearLayout>

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/rBtnCalendar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="날짜 설정 (캘린더)"/>
        <RadioButton
            android:id="@+id/rBtnTime"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="시간 설정 (시계형)"/>
    </RadioGroup>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

            <CalendarView
                android:id="@+id/calendarView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:showWeekNumber="false" />

            <TimePicker
                android:id="@+id/timerPicker"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:timePickerMode="spinner" />
        </FrameLayout>

    </LinearLayout>

    <Button
        android:id="@+id/btnEnd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="예약완료"
        android:textSize="18dp"
        android:background="#FFFFFF"
        android:textColor="#000000"/>

</LinearLayout>

MainActivity.java의 내용은 다음과 같다.

package com.example.littleairbnb;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
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.RadioButton;
import android.widget.TimePicker;
import android.widget.Chronometer;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    Chronometer chrono;
    Button btnStart,btnEnd;
    RadioButton rBtnCalendar, rBtnTime;
    CalendarView calView;
    TimePicker tPicker;
    int selectYear, selectMonth, selectDay;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStart = (Button) findViewById(R.id.btnStart);
        btnEnd = (Button) findViewById(R.id.btnEnd);

        chrono = (Chronometer) findViewById(R.id.chronometer);

        rBtnCalendar = (RadioButton) findViewById(R.id.rBtnCalendar);
        rBtnTime = (RadioButton) findViewById(R.id.rBtnTime);

        tPicker = (TimePicker) findViewById(R.id.timePicker);
        calView = (CalendarView) findViewById(R.id.calendarView);

        tPicker.setVisibility(View.INVISIBLE);
        calView.setVisibility(View.INVISIBLE);

        rBtnCalendar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calView.setVisibility(View.INVISIBLE);
                tPicker.setVisibility(View.VISIBLE);
            }
        });

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chrono.setBase(SystemClock.elapsedRealtime());
                chrono.start();
                chrono.setTextColor(Color.RED);

            }
        });
        btnEnd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chrono.stop();
                chrono.setTextColor(Color.BLUE);

                Toast.makeText(getApplicationContext(),
                        Integer.toString(selectYear) + "년" +
                        Integer.toString(selectMonth) + "월" +
                        Integer.toString(selectDay) + "일" +
                        Integer.toString(tPicker.getCurrentHour()) + "시" +
                        Integer.toString(tPicker.getCurrentMinute()) + "분 저장됨"
                                , Toast.LENGTH_LONG).show();
            }
        });

        calView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
                selectYear = year;
                selectMonth = month + 1;
                selectDay = dayOfMonth;
            }
        });
    }
}

에러 이슈:

An issue was found when checking AAR metadata:Dependency 'androidx.activity:activity:1.8.0' requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs. :app is currently compiled against android-33. Recommended action: Update this project to use a newer compileSdk

 

가 발생했다. 내가 해결한 방법은 다음과 같다.

build.gradle.kts (:app)파일(위치: gradle scripts 아래)에서 compileSdk와 targetSdk를 34로 변경하면 된다. 프로젝트의 compileSdk 버전이 현재 사용 중인 androidx.activity:activity:1.8.0 라이브러리의 요구사항을 충족시키지 못하고 있어서 발생한 문제이므로 버전을 바꿔주면 해결된다.

 

결과:

날짜와 시간을 선택해서 예약을 할 수 있는 어플리케이션 완성