본문 바로가기

Dev/안드로이드

안드로이드 프로그래밍 6장 실습 6-1

728x90
반응형
Android Studio를 활용한 안드로이드 프로그래밍
국내도서
저자 : 우재남,박길식
출판 : 한빛아카데미 2020.01.08
상세보기

한빛아카데미 IT COOKBOOK 276 Android Studio를 활용한 안드로이드 프로그래밍 5판 p.243

 

시간 및 날짜와 관련된 위젯을 이용하여 몇 가지 기능을 하는 날짜/시간 예약 앱을 만들어보자.

 

타이머 기능 : <예약 시작>과 <예약 완료>를 클릭하면 크로노미터가 타이머로 동작한다.

날짜/시간 설정 : <날짜 설정>과 <시간 설정>을 클릭하면 예약할 날짜와 시간을 변경할 수 있다.

<예약 완료>를 클릭하면 설정한 날짜와 시간이 결정된다.

 

activity_main.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"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <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/chronometer1"
            android:format="예약에 걸린 시간 %s"
            android:gravity="center"
            android:textSize="20dp" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btnStart"
            android:text="예약 시작" />
    </LinearLayout>

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

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rdoCal"
            android:text="날짜 설정 (캘린더뷰)" />
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rdoTime"
            android:text="시간 설정" />
    </RadioGroup>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <CalendarView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/calenderView1"
                android:showWeekNumber="false" />
            <TimePicker
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:timePickerMode="spinner"
                android:id="@+id/timePicker1" />
        </FrameLayout>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="#CCCCCC" >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btnEnd"
            android:text="예약완료" />

        <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>

책에는 timepicker에 모드 설정하는 코드가 적혀있지 않지만 책의 이미지처럼 구현하기 위해서는

android:timePickerMode="spinner" 속성을 추가해주어야 합니다.

 

activity_main.xml 동작 화면

 

MainActivity.java

package com.cookandroid.project6_11;

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.TextView;
import android.widget.TimePicker;

import com.cookandroid.project6_11.R;

public class MainActivity extends AppCompatActivity {

    Chronometer chrono;
    Button btnStart, btnEnd;
    RadioButton rdoCal, rdoTime;
    CalendarView calView;
    TimePicker tPicker;
    TextView tvYear, tvMonth, tvDay, tvHour, tvMinute;
    int selectYear, selectMonth, selectDay;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("시간 예약");

        btnStart=(Button)findViewById(R.id.btnStart);
        btnEnd=(Button)findViewById(R.id.btnEnd);
        chrono=(Chronometer)findViewById(R.id.chronometer1);
        rdoCal=(RadioButton)findViewById(R.id.rdoCal);
        rdoTime=(RadioButton)findViewById(R.id.rdoTime);
        tPicker=(TimePicker)findViewById(R.id.timePicker1);
        calView=(CalendarView)findViewById(R.id.calenderView1);
        tvYear=(TextView)findViewById(R.id.tvYear);
        tvMonth=(TextView)findViewById(R.id.tvMonth);
        tvDay=(TextView)findViewById(R.id.tvDay);
        tvHour=(TextView)findViewById(R.id.tvHour);
        tvMinute=(TextView)findViewById(R.id.tvMinute);

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

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

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

        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);
                tvYear.setText(Integer.toString(selectYear));
                tvMonth.setText(Integer.toString(selectMonth));
                tvDay.setText(Integer.toString(selectDay));

                tvHour.setText(Integer.toString(tPicker.getCurrentHour()));
                tvMinute.setText(Integer.toString(tPicker.getCurrentMinute()));
            }
        });

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


    }
}

 

저는 이 부분에서 책을 제대로 안 보고 하다가 실수를 했었는데요.

 

tvYear 부터 tvMinute 의 setText(Integer~ 이 코딩 5줄을 btnEnd setOnClickListener 밖에 선언해 놓고 예약 완료를

 

AVD에서 계속 눌러봐도 값이 변경되지 않았었는데요. 책을 천천히 읽지 않아서 생긴 문제라.. 간혹 실수하시는 분들

 

조심하시길 바랍니다.

 

Android Studio AVD 실행 결과

어플리케이션 build 결과

728x90
반응형

"); wcs_do();