Android多功能时钟源代码,Android多功能时钟开发案例(实战篇)

上一篇为大家介绍的是Android多功能时钟开发基础内容,大家可以回顾一下,Android多功能时钟开发案例(基础篇)接下来进入实战,快点来学习吧。一、时钟在布局文件中我们看到,界面上只有一个TextView,这个TextView的作用就是显示一个系统的当前时间,同时这个时间还是一秒一秒跳的,要实现一秒一秒的跳就需要我们每隔一秒就要刷新一下,同时我们这里还考虑了切换到另一个Tab的时候,这个时间就...
摘要由CSDN通过智能技术生成

上一篇为大家介绍的是Android多功能时钟开发基础内容,大家可以回顾一下,Android多功能时钟开发案例(基础篇)

接下来进入实战,快点来学习吧。

一、时钟

在布局文件中我们看到,界面上只有一个TextView,这个TextView的作用就是显示一个系统的当前时间,同时这个时间还是一秒一秒跳的,要实现一秒一秒的跳就需要我们每隔一秒就要刷新一下,同时我们这里还考虑了切换到另一个Tab的时候,这个时间就不跳动了,这样就会减少这个对系统的占用,考虑到了这点我们在这里用到了Handler,通过handler发送的msg.what 来判断是否要刷新时间。

public class TimeView extends LinearLayout {

private TextView tvTime;

public TimeView(Context context) {

super(context);

}

public TimeView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public TimeView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

protected void onFinishInflate() {

super.onFinishInflate();

tvTime = (TextView) findViewById(R.id.tvTime);

//tvTime.setText("hello");

timeHandler.sendEmptyMessage(0);

}

@Override

protected void onVisibilityChanged(View changedView, int visibility) {

super.onVisibilityChanged(changedView, visibility);

//当再次切换到这个Tab时我们就再发送一次这个消息,否者就把所有的消息移除掉

if (visibility == View.VISIBLE) {

timeHandler.sendEmptyMessage(0);

}else{

timeHandler.removeMessages(0);

}

}

private void refreshTime(){

//获取当前的时间

Calendar c = Calendar.getInstance();

tvTime.setText(String.format("%d:%d:%d", c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND)));

}

private Handler timeHandler = new Handler(){

public void handleMessage(android.os.Message msg) {

refreshTime();

//处于当前Tab的时候给自己发送信息,可以刷新

if (getVisibility() == View.VISIBLE) {

//1秒钟后再次执行以下sendEmptyMessage,what参数用于区分不同的message

timeHandler.sendEmptyMessageDelayed(0, 1000);

}

};

};

}

其实这里的Handler可以用Timer来完成亦可以达到同样的效果。

在这里要提一下的是onFinishInflate(),这在我们自定义布局的时候一定要用到的,解释以及例子在之后上传的知识点中同样有,看看那个就可以了。

二、闹钟

从第二个布局中我们可以看到,我们在这里用到了一个ListView,这是用来存储我们添加的闹钟的,既然这里用到了ListView,那么我们接着就会想到要给这个ListView一个适配器adapter,因此我们会在这里创建这么一个适配器,

private ArrayAdapter adapter;

看到这里可能又会有疑问了,AlarmData这是个什么东西?有这么一个数据类型吗??其实这里我们自定义了一个数据类型,用来专门存储一下创建的闹钟时间。我们来看一下自定义的数据类型代码吧!

// 自定义数据类型

private static class AlarmData {

private long time = 0;

private Calendar date;

private String timeLabel = "";

public AlarmData(long time) {

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

}

public long getTime() {

return time;

}

public String getTimeLabel() {

return timeLabel;

}

public int getId() {

return (int) (getTime() / 1000 / 60);

}

@Override

public String toString() {

return getTimeLabel();

}

}

这个数据类型的代码其实还是很容易明白的,不多讲了。

当我们到这里的时候,我们其实还没有真正的完成,假如我们的代码已经写好了,并且可以运行了我们运行一次后,并且添加了N个闹钟,当我们退出程序,再次打开就会发现,我们之前创建的闹钟都没了,原因是我们虽然把数据临时的保存在了ListView中,但是我们并没有长时间的保存,因此我们接着就来讲讲长久的保存这些闹钟数据。

private void saveAlarmList() {

Editor editor = getContext().getSharedPreferences(

AlarmView.class.getName(), Context.MODE_PRIVATE).edit();

StringBuffer sb = new StringBuffer();

for (int i = 0; i < adapter.getCount(); i++) {

sb.append(adapter.getItem(i).getTime()).append(",");

}

if (sb.length() > 1) {

String content = 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();

}

有了保存,我们当然的会想到读取

private void readSaveAlarmList() {

SharedPreferences sp = getContext().getSharedPreferences(

AlarmView.class.getName(), Context.MODE_PRIVATE);

String content = sp.getString(KEY_ALARM_LIST, null);

if (content != null) {

String[] timeStrings = content.split(",");

for (String string : timeStrings) {

adapter.add(new AlarmData(Long.parseLong(string)));

}

}

}

上面的一些陌生的类型在之后的知识点中可以查看。

接着我们来看看最关键的就是添加闹钟

private void addAlarm() {

Calendar c = Calendar.getInstance();

new TPDiolog(getContext(), new TimePickerDialog.OnTimeSetListener() {

@Override

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);

calendar.set(Calendar.MINUTE, minute);

calendar.set(Calendar.SECOND, 0);

calendar.set(Calendar.MILLISECOND, 0);

Calendar currentTime = Calendar.getInstance();

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值