问题提出
在上一教程文章Android开发:日期控件的使用(一)中,我们android开发的布局已经敲定,系统时间也已经显示在指定位置了,那么另两个功能该怎么实现呢,它们都用到什么了呢?
问题分析
本文将使用DatePicker和TimePicker完成时间的选择,并启动Chronometer。这样当我们设定的时间和当前时间相等时(分、时相等),小闹钟就开始动作,闪烁标题背景颜色。
问题解决
一、现在明确下本文要完成的功能:
- 当单击设置时间后的显示日期的TextView将弹出DatePicker,并将设置好的时间赋给显示日期的TextView,同时启动计时器。
- 当单击设置时间后的显示时间的TextView将弹出TimePicker,并将设置好的时间赋给显示时间的TextView,同时启动计时器。
- 显示时间与设定时间相同时闪烁“小闹钟”TextView的背景颜色。
二、功能实现
1. 当单击设置时间后的显示日期的TextView将弹出DatePicker,并将设置好的时间赋给显示日期的TextView,同时启动计时器。
这个功能,我们可以拆分成三部分,一个是单击事件、一个是DatePicker对话框的创建、还有一个就是计时器的启动
单击事件很简单,就是使用之前说过的OnClickListener,弹出对话框相对麻烦些。
1.1 定义对话框标签和计时器变量
1 | static final int DATE_DIALOG_ID = 0 ; |
2 | private Chronometer cmCM; |
1.2在OnCreate中班实例化定时器
1 | cmCM = (Chronometer)findViewById(R.id.chronometer1); |
1.3重载OnDialogCreate函数
2 | protected Dialog onCreateDialog( int id) { |
5 | return new DatePickerDialog( this , |
6 | ddSetDateListener, intYear, intMonth, intDay); |
其中 ddSetDateListener是我们定义的单击DataPicker的设置按钮后的监听器,即按下DataPicker的“设置”按钮后需要做的事情——设置TextView的值和启动计时器,其定义如下:
01 | private DatePickerDialog.OnDateSetListener ddSetDateListener = new DatePickerDialog.OnDateSetListener() { |
02 | public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { |
04 | intMonth = monthOfYear; |
08 | .append(intYear).append( "年" ) |
09 | .append(intMonth + 1 ).append( "月" ) |
10 | .append(intDay).append( "日" )); |
12 | cmCM.setBase(SystemClock.elapsedRealtime()); |
13 | cmCM.setFormat( "计时: %s" ); |
1.4设置单击事件
完成以上工作后,就可以设置TextView的单击响应了,因为之后显示时间的TextView也有单击响应,所以这里定义一个Listener,处理这两个单击动作。声明与定义及使用如下:
02 | private OnClickListener listener; |
03 | private TextView txtCD; |
05 | listener = new OnClickListener(){ |
06 | public void onClick(View v) |
09 | if (v.getId() == R.id.txtSetDate) |
11 | showDialog(DATE_DIALOG_ID); |
13 | else if (v.getId() == R.id.txtSetTime) |
15 | showDialog(TIME_DIALOG_ID); |
18 | txtSD = (TextView)findViewById(R.id.txtSetDate); |
20 | txtSD.setOnClickListener(listener); |
效果如图:
2. 当单击设置时间后的显示时间的TextView将弹出TimePicker,并将设置好的时间赋给显示时间的TextView,同时启动计时器这个与DatePicker用法差不多,这里不再详细讲,直接给出相关代码如下:
2.1对话框标签及TextView变量定义
1 | static final int TIME_DIALOG_ID = 1 ; |
2.2实例化并设置单击事件的监听器
1 | txtST = (TextView)findViewById(R.id.txtSetTime); |
2 | txtST.setOnClickListener(listener); |
2.3创建TimePicker对话框,这里修改之前重载的protected Dialog onCreateDialog(int id)函数,如下:
02 | protected Dialog onCreateDialog( int id) { |
05 | return new DatePickerDialog( this , ddSetDateListener, |
06 | intYear, intMonth, intDay); |
08 | return new TimePickerDialog( this , |
09 | ttSetTimeListener,intHour,intMinute, true ); |
2.4设置OnTimeSetListener用来响应单击TimePicker对话框中“设置”按钮
01 | private TimePickerDialog.OnTimeSetListener ttSetTimeListener = new TimePickerDialog.OnTimeSetListener(){ |
03 | public void onTimeSet(TimePicker view, int hourOfDay, int minute) { |
06 | txtST.setText( new StringBuilder() |
07 | .append(intHour< 10 ?( "0" +intHour):intHour).append( " : " ) |
08 | .append(intMinute< 10 ?( "0" +intMinute):intMinute).append( " : 00" )); |
09 | cmCM.setBase(SystemClock.elapsedRealtime()); |
10 | cmCM.setFormat( "计时: %s" ); |
这样,我们定时功能就完成了,这里要注意的是,TimePicker只有小时和分钟,在构造函数TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener callBack, inthourOfDay, int minute, boolean is24HourView)中,最后一个bool值设为true代表使用24小时制。
3.显示时间与设定时间相同时闪烁“小闹钟”TextView的背景颜色。
这里主要用到我们设置的计时器,用计时器的OnChronometerTickListener监听器,即在计时器内容发生变化时响应,相当于其他语言中的OnTimer函数。
为了方便陈述,这里只做时间计时,即设闹钟为每天都在该设定时间时闪烁。
02 | private OnChronometerTickListener oclistener; |
03 | static private int color; |
04 | private Time srct,nowt; |
08 | oclistener = new OnChronometerTickListener(){ |
10 | public void onChronometerTick(Chronometer arg0) { |
12 | final Calendar mycalendar = Calendar.getInstance(); |
13 | intYear = mycalendar.get(Calendar.YEAR); |
14 | intMonth = mycalendar.get(Calendar.MONTH); |
15 | intDay = mycalendar.get(Calendar.DAY_OF_MONTH); |
21 | srct.set( 0 , intMinute, intHour, intDay, intMonth, intYear); |
23 | if (nowt.hour==srct.hour&& nowt.minute == srct.minute) |
25 | TextView txtTitle = (TextView)findViewById(R.id.txtTitle); |
26 | txtTitle.setBackgroundColor(color); |
27 | if (color == Color.BLUE) |
最终效果:
问题总结
在本文的android开发教程中我们简单的演示了时间拾取器TimePicker、日期拾取器DatePicker、计时器Chronometer、模拟时钟AnologClock和数字时钟DigitalClock的使用。当然本文的小例子旨在抛砖引玉,让大家了解Android中,那些和时间有关的东西。
对于计时器Chronometer,本例未涉及到的,但也常用的方法还有stop();该方法相当于暂停,在使用该方法后再使用start()方法,计时器将从停止那刻继续计时。如果想要计时器在停止后重新启动时从零开始计时就需要加上cmCM.setBase(SystemClock.elapsedRealtime());用以归零。
这个简单的android开发例子,希望对大家有点启发,从而创作出更加美观、功能更加强劲的时钟软件来。本教程及上一教程的代码在附件位置可以下载,有需要的朋友可以直接下载。
附件: EXP03.zip