728x90
반응형
![]() |
|
한빛아카데미 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" 속성을 추가해주어야 합니다.
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 실행 결과
728x90
반응형
'Dev > 안드로이드' 카테고리의 다른 글
안드로이드 프로그래밍 5장 직접 풀어보기 5-5 (2) | 2020.05.28 |
---|---|
안드로이드 프로그래밍 6장 직접 풀어보기 6-1 (0) | 2020.05.26 |
안드로이드 프로그래밍 4장 직접 풀어보기 4-3 (0) | 2020.05.11 |
안드로이드 프로그래밍 5장 연습문제 4번 (0) | 2020.05.07 |
안드로이드 프로그래밍 4장 직접 풀어보기 4-4 (0) | 2020.05.06 |