Android多功能时钟开发案例(实战篇)
上一篇为大家介绍的是Android多功能时钟开发基础内容,大家可以回顾一下,Android多功能时钟开发案例(基础篇)
接下来进入实战,快点来学习吧。
一、时钟
在布局文件中我们看到,界面上只有一个TextView,这个TextView的作用就是显示一个系统的当前时间,同时这个时间还是一秒一秒跳的,要实现一秒一秒的跳就需要我们每隔一秒就要刷新一下,同时我们这里还考虑了切换到另一个Tab的时候,这个时间就不跳动了,这样就会减少这个对系统的占用,考虑到了这点我们在这里用到了Handler,通过handler发送的msg.what来判断是否要刷新时间。
publicclassTimeViewextendsLinearLayout{
privateTextViewtvTime;
publicTimeView(Contextcontext){
super(context);
}
publicTimeView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicTimeView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
@Override
protectedvoidonFinishInflate(){
super.onFinishInflate();
tvTime=(TextView)findViewById(R.id.tvTime);
//tvTime.setText("hello");
timeHandler.sendEmptyMessage(0);
}
@Override
protectedvoidonVisibilityChanged(ViewchangedView,intvisibility){
super.onVisibilityChanged(changedView,visibility);
//当再次切换到这个Tab时我们就再发送一次这个消息,否者就把所有的消息移除掉
if(visibility==View.VISIBLE){
timeHandler.sendEmptyMessage(0);
}else{
timeHandler.removeMessages(0);
}
}
privatevoidrefreshTime(){
//获取当前的时间
Calendarc=Calendar.getInstance();
tvTime.setText(String.format("%d:%d:%d",c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND)));
}
privateHandlertimeHandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
refreshTime();
//处于当前Tab的时候给自己发送信息,可以刷新
if(getVisibility()==View.VISIBLE){
//1秒钟后再次执行以下sendEmptyMessage,what参数用于区分不同的message
timeHandler.sendEmptyMessageDelayed(0,1000);
}
};
};
}
其实这里的Handler可以用Timer来完成亦可以达到同样的效果。
在这里要提一下的是onFinishInflate(),这在我们自定义布局的时候一定要用到的,解释以及例子在之后上传的知识点中同样有,看看那个就可以了。
二、闹钟
从第二个布局中我们可以看到,我们在这里用到了一个ListView,这是用来存储我们添加的闹钟的,既然这里用到了ListView,那么我们接着就会想到要给这个ListView一个适配器adapter,因此我们会在这里创建这么一个适配器,
privateArrayAdapter<AlarmData>adapter; 
看到这里可能又会有疑问了,AlarmData这是个什么东西?有这么一个数据类型吗??其实这里我们自定义了一个数据类型,用来专门存储一下创建的闹钟时间。我们来看一下自定义的数据类型代码吧!
//自定义数据类型
privatestaticclassAlarmData{
privatelongtime=0;
privateCalendardate;
privateStringtimeLabel="";
publicAlarmData(longtime){
this.time=time;
date=Calendar.getInstance();
date.setTimeInMillis(time);
timeLabel=String.format("%d月%d日%d:%d",
date.get(Calendar.MONTH)+1,
date.get(Calendar.DAY_OF_MONTH),
date.get(Calendar.HOUR_OF_DAY),date.get(Calendar.MINUTE));
}
publiclonggetTime(){
returntime;
}
publicStringgetTimeLabel(){
returntimeLabel;
}
publicintgetId(){
return(int)(getTime()/1000/60);
}
@Override
publicStringtoString(){
returngetTimeLabel();
}
}
这个数据类型的代码其实还是很容易明白的,不多讲了。
当我们到这里的时候,我们其实还没有真正的完成,假如我们的代码已经写好了,并且可以运行了我们运行一次后,并且添加了N个闹钟,当我们退出程序,再次打开就会发现,我们之前创建的闹钟都没了,原因是我们虽然把数据临时的保存在了ListView中,但是我们并没有长时间的保存,因此我们接着就来讲讲长久的保存这些闹钟数据。
privatevoidsaveAlarmList(){
Editoreditor=getContext().getSharedPreferences(
AlarmView.class.getName(),Context.MODE_PRIVATE).edit();
StringBuffersb=newStringBuffer();
for(inti=0;i<adapter.getCount();i++){
sb.append(adapter.getItem(i).getTime()).append(",");
}
if(sb.length()>1){
Stringcontent=sb.toString().substring(0,sb.length()-1);
editor.putString(KEY_ALARM_LIST,content);
System.out.println(content);
}else{
editor.putString(KEY_ALARM_LIST,null);
}
editor.commit();
}
有了保存,我们当然的会想到读取
privatevoidreadSaveAlarmList(){
SharedPreferencessp=getContext().getSharedPreferences(
AlarmView.class.getName(),Context.MODE_PRIVATE);
Stringcontent=sp.getString(KEY_ALARM_LIST,null);
if(content!=null){
String[]timeStrings=content.split(",");
for(Stringstring:timeStrings){
adapter.add(newAlarmData(Long.parseLong(string)));
}
}
}
上面的一些陌生的类型在之后的知识点中可以查看。
接着我们来看看最关键的就是添加闹钟
privatevoidaddAlarm(){
Calendarc=Calendar.getInstance();
newTPDiolog(getContext(),newTimePickerDialog.OnTimeSetListener(){
@Override
publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){
Calendarcalendar=Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE,minute);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
CalendarcurrentTime=Calendar.getInstance();
if(currentTime.getTimeInMillis()>=calendar.getTimeInMillis()){
calendar.setTimeInMillis(calendar.getTimeInMillis()+24
*60*60*1000);
}
AlarmDataad=newAlarmData(calendar.getTimeInMillis());
adapter.add(ad);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
ad.getTime(),5*60*1000,PendingIntent
.getBroadcast(getContext(),ad.getId(),
newIntent(getContext(),
AlarmReceiver.class),0));
saveAlarmList();
}
},c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show();
}
这里我们可以看到TPDiolog这个,当你自己尝试过后可能也会遇到同样的问题,那就是当你通过TimePickerDialog这个系统的时间选择控件的时候,点击确定后,会创建两条记录,这是因为我们点击确定后会调用该事件监听器的时间,在关闭这个Dialog的时候也会调用一次,所以我们在这里自己重写了一下该类的方法
TPDiolog.class
publicclassTPDiologextendsTimePickerDialog{
publicTPDiolog(Contextcontext,OnTimeSetListenercallBack,inthourOfDay,
intminute,booleanis24HourView){
super(context,callBack,hourOfDay,minute,is24HourView);
}
//重写该方法是为了避免调用两次onTimeSet
@Override
protectedvoidonStop(){
//super.onStop();
}
}
在之前的代码中我们还看到了一个alarmManager这一对象,这是我们为了调用系统的闹钟服务创建的实例,我们也因此而创建了一个AlarmReceiver.class
publicclassAlarmReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentarg1){
System.out.println("闹钟执行了!");
AlarmManageram=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.cancel(PendingIntent.getBroadcast(context,getResultCode(),newIntent(context,AlarmReceiver.class),0));
Intenti=newIntent(context,PlayAlarmAty.class);
//设置intent的启动模式
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
一些小的地方讲好了,最后把AlarmView.class的完整代码贴上。
packagecom.example.clock;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.Iterator;
importandroid.app.AlarmManager;
importandroid.app.AlertDialog;
importandroid.app.PendingIntent;
importandroid.app.TimePickerDialog;
importandroid.app.TimePickerDialog.OnTimeSetListener;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.SharedPreferences;
importandroid.content.SharedPreferences.Editor;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.OnItemLongClickListener;
importandroid.widget.ArrayAdapter;
importandroid.widget.Button;
importandroid.widget.LinearLayout;
importandroid.widget.ListView;
importandroid.widget.Switch;
importandroid.widget.TimePicker;
publicclassAlarmViewextendsLinearLayout{
privateButtonbtnAddAlarm;
privateListViewlvListAlarm;
privateArrayAdapter<AlarmData>adapter;
privateAlarmManageralarmManager;
publicAlarmView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
init();
}
publicAlarmView(Contextcontext,AttributeSetattrs){
super(context,attrs);
init();
}
publicAlarmView(Contextcontext){
super(context);
init();
}
privatevoidinit(){
alarmManager=(AlarmManager)getContext().getSystemService(
Context.ALARM_SERVICE);
}
@Override
protectedvoidonFinishInflate(){
super.onFinishInflate();
btnAddAlarm=(Button)findViewById(R.id.btnAddAlarm);
lvListAlarm=(ListView)findViewById(R.id.lvListAlarm);
adapter=newArrayAdapter<AlarmData>(getContext(),
android.R.layout.simple_list_item_1);
lvListAlarm.setAdapter(adapter);
readSaveAlarmList();
//adapter.add(newAlarmData(System.currentTimeMillis()));
btnAddAlarm.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
addAlarm();
}
});
//长按某项删除
lvListAlarm.setOnItemLongClickListener(newOnItemLongClickListener(){
@Override
publicbooleanonItemLongClick(AdapterView<?>arg0,Viewarg1,
finalintposition,longarg3){
newAlertDialog.Builder(getContext())
.setTitle("操作选项")
.setItems(newCharSequence[]{"删除","删除1"},
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,
intwhich){
switch(which){
case0:
deleteAlarm(position);
break;
default:
break;
}
}
}).setNegativeButton("取消",null).show();
returntrue;
}
});
}
privatevoiddeleteAlarm(intposition){
AlarmDataad=adapter.getItem(position);
adapter.remove(ad);
saveAlarmList();
alarmManager.cancel(PendingIntent.getBroadcast(getContext(),
ad.getId(),newIntent(getContext(),AlarmReceiver.class),0));
}
privatevoidaddAlarm(){
Calendarc=Calendar.getInstance();
newTPDiolog(getContext(),newTimePickerDialog.OnTimeSetListener(){
@Override
publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){
Calendarcalendar=Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE,minute);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
CalendarcurrentTime=Calendar.getInstance();
if(currentTime.getTimeInMillis()>=calendar.getTimeInMillis()){
calendar.setTimeInMillis(calendar.getTimeInMillis()+24
*60*60*1000);
}
AlarmDataad=newAlarmData(calendar.getTimeInMillis());
adapter.add(ad);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
ad.getTime(),5*60*1000,PendingIntent
.getBroadcast(getContext(),ad.getId(),
newIntent(getContext(),
AlarmReceiver.class),0));
saveAlarmList();
}
},c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show();
}
privatestaticfinalStringKEY_ALARM_LIST="alarmlist";
privatevoidsaveAlarmList(){
Editoreditor=getContext().getSharedPreferences(
AlarmView.class.getName(),Context.MODE_PRIVATE).edit();
StringBuffersb=newStringBuffer();
for(inti=0;i<adapter.getCount();i++){
sb.append(adapter.getItem(i).getTime()).append(",");
}
if(sb.length()>1){
Stringcontent=sb.toString().substring(0,sb.length()-1);
editor.putString(KEY_ALARM_LIST,content);
System.out.println(content);
}else{
editor.putString(KEY_ALARM_LIST,null);
}
editor.commit();
}
privatevoidreadSaveAlarmList(){
SharedPreferencessp=getContext().getSharedPreferences(
AlarmView.class.getName(),Context.MODE_PRIVATE);
Stringcontent=sp.getString(KEY_ALARM_LIST,null);
if(content!=null){
String[]timeStrings=content.split(",");
for(Stringstring:timeStrings){
adapter.add(newAlarmData(Long.parseLong(string)));
}
}
}
//自定义数据类型
privatestaticclassAlarmData{
privatelongtime=0;
privateCalendardate;
privateStringtimeLabel="";
publicAlarmData(longtime){
this.time=time;
date=Calendar.getInstance();
date.setTimeInMillis(time);
timeLabel=String.format("%d月%d日%d:%d",
date.get(Calendar.MONTH)+1,
date.get(Calendar.DAY_OF_MONTH),
date.get(Calendar.HOUR_OF_DAY),date.get(Calendar.MINUTE));
}
publiclonggetTime(){
returntime;
}
publicStringgetTimeLabel(){
returntimeLabel;
}
publicintgetId(){
return(int)(getTime()/1000/60);
}
@Override
publicStringtoString(){
returngetTimeLabel();
}
}
}
三、计时器
计时器的主要功能就是你先设定一个时间,然后点击开始,时间就会一秒一秒的减少,在这里我么主要用到了Timer这个系统的计时器,这代码中没有上面难懂的地方,有些地方已经给上注释了,所以直接贴代码,可能有些人会不知道Timer怎么用,之后的知识点中都会有提到。
packagecom.example.clock;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.R.integer;
importandroid.app.AlertDialog;
importandroid.content.Context;
importandroid.os.Handler;
importandroid.text.Editable;
importandroid.text.TextUtils;
importandroid.text.TextWatcher;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.LinearLayout;
publicclassTimerViewextendsLinearLayout{
publicTimerView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicTimerView(Contextcontext){
super(context);
}
@Override
protectedvoidonFinishInflate(){
super.onFinishInflate();
btnStart=(Button)findViewById(R.id.btnStart);
btnPause=(Button)findViewById(R.id.btnPause);
btnResume=(Button)findViewById(R.id.btnResume);
btnReset=(Button)findViewById(R.id.btnReset);
btnStart.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
startTimer();
btnStart.setVisibility(View.GONE);
btnPause.setVisibility(View.VISIBLE);
btnReset.setVisibility(View.VISIBLE);
}
});
btnPause.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
stopTimer();
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.VISIBLE);
}
});
btnResume.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
startTimer();
btnPause.setVisibility(View.VISIBLE);
btnResume.setVisibility(View.GONE);
}
});
btnReset.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
stopTimer();
etHour.setText("00");
etMin.setText("00");
etSec.setText("00");
btnReset.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnPause.setVisibility(View.GONE);
btnStart.setVisibility(View.VISIBLE);
}
});
etHour=(EditText)findViewById(R.id.etHour);
etMin=(EditText)findViewById(R.id.etMin);
etSec=(EditText)findViewById(R.id.etSec);
etHour.setText("00");
etHour.addTextChangedListener(newTextWatcher(){
@Override
publicvoidonTextChanged(CharSequences,intstart,intbefore,
intcount){
/*
*这个方法是在Text改变过程中触发调用的,它的意思就是说在原有的文本s中,
*从start开始的count个字符替换长度为before的旧文本,
*注意这里没有将要之类的字眼,也就是说一句执行了替换动作。
*/
if(!TextUtils.isEmpty(s)){
intvalue=Integer.parseInt(s.toString());
if(value>59){
etHour.setText("59");
}elseif(value<0){
etHour.setText("00");
}
}
checkToEnableBtnStart();
}
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
intafter){
}
@Override
publicvoidafterTextChanged(Editables){
}
});
etMin.setText("00");
etMin.addTextChangedListener(newTextWatcher(){
@Override
publicvoidonTextChanged(CharSequences,intstart,intbefore,
intcount){
if(!TextUtils.isEmpty(s)){
intvalue=Integer.parseInt(s.toString());
if(value>59){
etMin.setText("59");
}elseif(value<0){
etMin.setText("00");
}
}
checkToEnableBtnStart();
}
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
intafter){
}
@Override
publicvoidafterTextChanged(Editables){
}
});
etSec.setText("00");
etSec.addTextChangedListener(newTextWatcher(){
@Override
publicvoidonTextChanged(CharSequences,intstart,intbefore,
intcount){
if(!TextUtils.isEmpty(s)){
intvalue=Integer.parseInt(s.toString());
if(value>59){
etSec.setText("59");
}elseif(value<0){
etSec.setText("00");
}
}
checkToEnableBtnStart();
}
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
intafter){
}
@Override
publicvoidafterTextChanged(Editables){
}
});
btnStart.setVisibility(View.VISIBLE);
btnStart.setEnabled(false);
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnReset.setVisibility(View.GONE);
}
privatevoidcheckToEnableBtnStart(){
btnStart.setEnabled((!TextUtils.isEmpty(etHour.getText())&&Integer
.parseInt(etHour.getText().toString())>0)
||(!TextUtils.isEmpty(etMin.getText())&&Integer
.parseInt(etMin.getText().toString())>0)
||(!TextUtils.isEmpty(etSec.getText())&&Integer
.parseInt(etSec.getText().toString())>0));
}
privatevoidstartTimer(){
if(timerTask==null){
allTimeCount=Integer.parseInt(etHour.getText().toString())*60
*60+Integer.parseInt(etMin.getText().toString())*60
+Integer.parseInt(etSec.getText().toString());
timerTask=newTimerTask(){
@Override
publicvoidrun(){
allTimeCount--;
handle.sendEmptyMessage(MSG_WHAT_TIME_TICK);
if(allTimeCount<=0){
handle.sendEmptyMessage(MSG_WHAT_TIME_IS_UP);
stopTimer();
}
}
};
timer.schedule(timerTask,1000,1000);
}
}
privatevoidstopTimer(){
if(timerTask!=null){
timerTask.cancel();
timerTask=null;
}
}
privateHandlerhandle=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
switch(msg.what){
caseMSG_WHAT_TIME_TICK:
inthour=allTimeCount/60/60;
intmin=(allTimeCount/60)%60;
intsec=allTimeCount%60;
etHour.setText(hour+"");
etMin.setText(min+"");
etSec.setText(sec+"");
break;
caseMSG_WHAT_TIME_IS_UP:
newAlertDialog.Builder(getContext())
.setTitle("Timeisup!")
.setMessage("Timeisup!")
.setNegativeButton("Cancle",null).show();
btnReset.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnPause.setVisibility(View.GONE);
btnStart.setVisibility(View.VISIBLE);
break;
default:
break;
}
};
};
privatestaticfinalintMSG_WHAT_TIME_IS_UP=1;
privatestaticfinalintMSG_WHAT_TIME_TICK=2;
privateintallTimeCount=0;
privateTimertimer=newTimer();
privateTimerTasktimerTask=null;
privateButtonbtnStart,btnPause,btnResume,btnReset;
privateEditTextetHour,etMin,etSec;
}
四、秒表
最后的秒表相信大家都不陌生,用到的知识正好之前的三个都有讲到,只要明白前三个后,这个就不难理解了。
packagecom.example.clock;
importjava.util.ArrayList;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.content.Context;
importandroid.os.Handler;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroid.widget.ArrayAdapter;
importandroid.widget.Button;
importandroid.widget.LinearLayout;
importandroid.widget.ListView;
importandroid.widget.TextView;
publicclassStopWatchViewextendsLinearLayout{
privateTextViewtvHour,tvMin,tvSec,tvMsec;
privateButtonbtnStart,btnPause,btnResume,btnReset,btnLap;
privateListViewlvTimeList;
privateArrayAdapter<String>adapter;
publicStopWatchView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
@Override
protectedvoidonFinishInflate(){
super.onFinishInflate();
tvHour=(TextView)findViewById(R.id.timeHour);
tvHour.setText("0");
tvMin=(TextView)findViewById(R.id.timeMin);
tvMin.setText("0");
tvSec=(TextView)findViewById(R.id.timeSec);
tvSec.setText("0");
tvMsec=(TextView)findViewById(R.id.timeMsec);
tvMsec.setText("0");
btnStart=(Button)findViewById(R.id.btnSWStart);
btnPause=(Button)findViewById(R.id.btnSWPause);
btnResume=(Button)findViewById(R.id.btnSWResume);
btnLap=(Button)findViewById(R.id.btnSWLap);
btnReset=(Button)findViewById(R.id.btnSWReset);
btnStart.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
startTimer();
btnStart.setVisibility(View.GONE);
btnPause.setVisibility(View.VISIBLE);
btnLap.setVisibility(View.VISIBLE);
}
});
btnPause.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
stopTimer();
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.VISIBLE);
btnLap.setVisibility(View.GONE);
btnReset.setVisibility(View.VISIBLE);
}
});
btnResume.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
startTimer();
btnResume.setVisibility(View.GONE);
btnPause.setVisibility(View.VISIBLE);
btnLap.setVisibility(View.VISIBLE);
btnReset.setVisibility(View.GONE);
}
});
btnReset.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
stopTimer();
tenMSecs=0;
adapter.clear();
btnReset.setVisibility(View.GONE);
btnLap.setVisibility(View.GONE);
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnStart.setVisibility(View.VISIBLE);
}
});
btnLap.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
adapter.insert(String.format("%d:%d:%d.%d",tenMSecs/100/60/60,tenMSecs/100/60%60,tenMSecs/100%60,tenMSecs%100),0);
}
});
btnLap.setVisibility(View.GONE);
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnReset.setVisibility(View.GONE);
lvTimeList=(ListView)findViewById(R.id.lvWatchTime);
adapter=newArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1);
lvTimeList.setAdapter(adapter);
showTimerTask=newTimerTask(){
@Override
publicvoidrun(){
handle.sendEmptyMessage(MSG_WHAT_SHOW_TIME);
}
};
timer.schedule(showTimerTask,200,200);
}
privatevoidstartTimer(){
if(timerTask==null){
timerTask=newTimerTask(){
@Override
publicvoidrun(){
tenMSecs++;
}
};
timer.schedule(timerTask,10,10);
}
}
privatevoidstopTimer(){
if(timerTask!=null){
timerTask.cancel();
timerTask=null;
}
}
privateinttenMSecs=0;
privateTimertimer=newTimer();
privateTimerTasktimerTask=null;
privateTimerTaskshowTimerTask=null;
privatestaticfinalintMSG_WHAT_SHOW_TIME=1;
privateHandlerhandle=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
switch(msg.what){
caseMSG_WHAT_SHOW_TIME:
tvHour.setText(tenMSecs/100/60/60+"");
tvMin.setText(tenMSecs/100/60%60+"");
tvSec.setText(tenMSecs/100%60+"");
tvMsec.setText(tenMSecs%100+"");
break;
default:
break;
}
};
};
publicvoidonDestroy(){
timer.cancel();
}
}
到此为止,自己的第一个实战算是完成了,但是就是界面很low,这个只是把基本的功能实现了,但是在界面上没有做很大的完善,在之后的实战中会慢慢改进的。
源码下载:Android多功能时钟
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。