Android开发:日期控件的使用(二)

来源:互联网 发布:音轨对比软件 编辑:程序博客网 时间:2024/06/05 03:52

【转载】http://www.androidwhy.com/android_14_58_zh.html


Android开发:日期控件的使用(二)

问题提出

    在上一教程文章Android开发:日期控件的使用(一)中,我们android开发的布局已经敲定,系统时间也已经显示在指定位置了,那么另两个功能该怎么实现呢,它们都用到什么了呢?

问题分析

    本文将使用DatePicker和TimePicker完成时间的选择,并启动Chronometer。这样当我们设定的时间和当前时间相等时(分、时相等),小闹钟就开始动作,闪烁标题背景颜色。

问题解决

一、现在明确下本文要完成的功能:

  1. 当单击设置时间后的显示日期的TextView将弹出DatePicker,并将设置好的时间赋给显示日期的TextView,同时启动计时器。
  2. 当单击设置时间后的显示时间的TextView将弹出TimePicker,并将设置好的时间赋给显示时间的TextView,同时启动计时器。
  3. 显示时间与设定时间相同时闪烁“小闹钟”TextView的背景颜色。

二、功能实现

1.   当单击设置时间后的显示日期的TextView将弹出DatePicker,并将设置好的时间赋给显示日期的TextView,同时启动计时器。

这个功能,我们可以拆分成三部分,一个是单击事件、一个是DatePicker对话框的创建、还有一个就是计时器的启动

单击事件很简单,就是使用之前说过的OnClickListener,弹出对话框相对麻烦些。

1.1  定义对话框标签和计时器变量

 

1static finalint DATE_DIALOG_ID = 0;
2private Chronometer cmCM;

 

1.2在OnCreate中班实例化定时器

 

1cmCM = (Chronometer)findViewById(R.id.chronometer1);

 

1.3重载OnDialogCreate函数

 

1@Override   
2protected Dialog onCreateDialog(intid) {
3   switch(id) {
4   caseDATE_DIALOG_ID:    
5        returnnew DatePickerDialog(this,
6            ddSetDateListener, intYear, intMonth, intDay);    
7        }
8   returnnull;
9}

 

其中 ddSetDateListener是我们定义的单击DataPicker的设置按钮后的监听器,即按下DataPicker的“设置”按钮后需要做的事情——设置TextView的值和启动计时器,其定义如下:

 

01private DatePickerDialog.OnDateSetListener ddSetDateListener =new DatePickerDialog.OnDateSetListener() {
02      publicvoid onDateSet(DatePicker view, int year, intmonthOfYear, int dayOfMonth) {    
03            intYear = year;    
04            intMonth = monthOfYear;    
05            intDay = dayOfMonth;
06            txtSD.setText(
07                newStringBuilder()
08                .append(intYear).append("年")
09                .append(intMonth +1).append("月")
10            .append(intDay).append("日"));// 设置TextView的值
11             // 启动定时器
12             cmCM.setBase(SystemClock.elapsedRealtime());// 从当前时间开始计时
13            cmCM.setFormat("计时: %s");// 时间格式
14            cmCM.start();// 开始计时
15        }
16};

 

1.4设置单击事件

完成以上工作后,就可以设置TextView的单击响应了,因为之后显示时间的TextView也有单击响应,所以这里定义一个Listener,处理这两个单击动作。声明与定义及使用如下:

 

01//声明:
02private OnClickListener listener;
03private TextView txtCD;
04//定义:
05listener = newOnClickListener(){
06            publicvoid onClick(View v)
07            {// TODO Auto-generated method stub
08                 
09                if(v.getId() == R.id.txtSetDate)
10                {        
11                    showDialog(DATE_DIALOG_ID);
12                }
13                elseif (v.getId() == R.id.txtSetTime)
14                {       
15                    showDialog(TIME_DIALOG_ID);
16                }
17            }};
18txtSD = (TextView)findViewById(R.id.txtSetDate);
19//使用:
20txtSD.setOnClickListener(listener);

 

效果如图:

       

2. 当单击设置时间后的显示时间的TextView将弹出TimePicker,并将设置好的时间赋给显示时间的TextView,同时启动计时器这个与DatePicker用法差不多,这里不再详细讲,直接给出相关代码如下:

 

2.1对话框标签及TextView变量定义

 

1static finalint TIME_DIALOG_ID = 1;
2private TextView txtST;

 

2.2实例化并设置单击事件的监听器

 

1txtST = (TextView)findViewById(R.id.txtSetTime);
2txtST.setOnClickListener(listener);

 

2.3创建TimePicker对话框,这里修改之前重载的protected Dialog onCreateDialog(int id)函数,如下:

 

01@Override   
02protected Dialog onCreateDialog(intid) {    
03    switch(id) {    
04       caseDATE_DIALOG_ID:    
05            returnnew DatePickerDialog(this, ddSetDateListener,    
06                        intYear, intMonth, intDay);
07       caseTIME_DIALOG_ID:
08           returnnew TimePickerDialog(this,
09                   ttSetTimeListener,intHour,intMinute,true);
10        }    
11        returnnull;}

 

2.4设置OnTimeSetListener用来响应单击TimePicker对话框中“设置”按钮

 

01private TimePickerDialog.OnTimeSetListener ttSetTimeListener =new TimePickerDialog.OnTimeSetListener(){
02@Override
03    publicvoid onTimeSet(TimePicker view, int hourOfDay, intminute) {
04intHour = hourOfDay;
05    intMinute = minute;
06    txtST.setText(newStringBuilder()
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");
11  cmCM.start();}};

 

这样,我们定时功能就完成了,这里要注意的是,TimePicker只有小时和分钟,在构造函数TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener callBack, inthourOfDay, int minute, boolean is24HourView)中,最后一个bool值设为true代表使用24小时制。

 

  3.显示时间与设定时间相同时闪烁“小闹钟”TextView的背景颜色。

这里主要用到我们设置的计时器,用计时器的OnChronometerTickListener监听器,即在计时器内容发生变化时响应,相当于其他语言中的OnTimer函数。

为了方便陈述,这里只做时间计时,即设闹钟为每天都在该设定时间时闪烁。

 

01//声明并初始化:
02private OnChronometerTickListener oclistener;
03static privateint color;// 用来存储颜色
04private Time srct,nowt;// srct表示设定的时间,nowt是当前时间
05color = Color.BLUE;
06 
07//实现OnChronometerTickListener的onChronometerTick(Chronometer arg0)方法:
08oclistener = newOnChronometerTickListener(){
09@Override
10public voidonChronometerTick(Chronometer arg0) {
11// TODO Auto-generated method stub
12    finalCalendar mycalendar = Calendar.getInstance();// 实例化日历
13            intYear = mycalendar.get(Calendar.YEAR);// 获取“年”
14            intMonth = mycalendar.get(Calendar.MONTH);// 获取“月”
15            intDay = mycalendar.get(Calendar.DAY_OF_MONTH);// 获取“日”
16                 
17            nowt =new Time();
18            srct =new Time();
19                 
20nowt.setToNow(); // 设置当前时间
21srct.set(0, intMinute, intHour, intDay, intMonth, intYear);// 设置为设定的时间
22// 设置背景颜色              
23if(nowt.hour==srct.hour&& nowt.minute == srct.minute)
24{
25    TextView txtTitle = (TextView)findViewById(R.id.txtTitle);
26    txtTitle.setBackgroundColor(color);
27    if(color == Color.BLUE)
28    {
29        color = Color.YELLOW;
30    }
31    else
32    {
33        color = Color.BLUE;
34    }
35}
36}};

 

最终效果:

问题总结

        在本文的android开发教程中我们简单的演示了时间拾取器TimePicker、日期拾取器DatePicker、计时器Chronometer、模拟时钟AnologClock和数字时钟DigitalClock的使用。当然本文的小例子旨在抛砖引玉,让大家了解Android中,那些和时间有关的东西。

对于计时器Chronometer,本例未涉及到的,但也常用的方法还有stop();该方法相当于暂停,在使用该方法后再使用start()方法,计时器将从停止那刻继续计时。如果想要计时器在停止后重新启动时从零开始计时就需要加上cmCM.setBase(SystemClock.elapsedRealtime());用以归零。

这个简单的android开发例子,希望对大家有点启发,从而创作出更加美观、功能更加强劲的时钟软件来。本教程及上一教程的代码在附件位置可以下载,有需要的朋友可以直接下载。

附件: EXP03.zip

标签: android开发,日期控件高级使用