实现了一个计时器APP,程序界面简洁,只有一个时间显示区域和两个图片按钮,一个按钮是开始/暂停,另外一个按钮是中止。ide
两个按钮,左边的是开始计时,计时过程当中点击为暂停计时功能右边的按钮为中止计时功能。.net
菜单功能有两个,3d
设置计时器单位有两种可选,1秒和0.1秒code
时间展现orm
if (1000 == mlTimerUnit) { // 秒 settingTimerUnitFlg = SETTING_SECOND_ID; tvTime.setText(R.string.init_time_second); } else if (100 == mlTimerUnit) { // 0.1秒 settingTimerUnitFlg = SETTING_100MILLISECOND_ID; tvTime.setText(R.string.init_time_100millisecond); }
// 设置时间展现 int min = (totalSec / 60); int sec = (totalSec % 60); try{ if (SETTING_SECOND_ID == settingTimerUnitFlg) { // 秒 tvTime.setText(String.format("%1$02d:%2$02d", min, sec)); } else if (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) { // 0.1秒 tvTime.setText(String.format("%1$02d:%2$02d:%3$d", min, sec, yushu)); } } catch(Exception e) { tvTime.setText("" + min + ":" + sec + ":" + yushu); e.printStackTrace(); } break;
其中变量具体含义为
图变量定义blog
开始暂停按钮图片
View.OnClickListener startPauseListener = new View.OnClickListener() { @Override public void onClick(View v) { if (null == timer) { if (null == task) { task = new TimerTask() { @Override public void run() { if (null == msg) { msg = new Message(); } else { msg = Message.obtain(); } msg.what = 1; handler.sendMessage(msg); } }; } timer = new Timer(true); timer.schedule(task, mlTimerUnit, mlTimerUnit); } // 开始 if (!bIsRunningFlg) { bIsRunningFlg = true; } else { // 暂停 try{ bIsRunningFlg = false; task.cancel(); task = null; timer.cancel(); // 取消计时 timer.purge(); timer = null; handler.removeMessages(msg.what); } catch(Exception e) { e.printStackTrace(); } } } };
中止计时按钮rem
// 中止 View.OnClickListener stopListener = new View.OnClickListener() { @Override public void onClick(View v) { if (null != timer) { task.cancel(); task = null; timer.cancel(); // 取消计时 timer.purge(); timer = null; handler.removeMessages(msg.what); } mlCount = 0; bIsRunningFlg = false; if (SETTING_SECOND_ID == settingTimerUnitFlg) { // 秒 tvTime.setText(R.string.init_time_second); } else if (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) { // 100 毫秒 tvTime.setText(R.string.init_time_100millisecond); } } };
设置菜单get
public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu);
设置子菜单虚拟机
// 设置子菜单的名称 SubMenu settingMenu = menu.addSubMenu(0, SETTING_TIMER_UNIT_ID, 0, R.string.menu_setting_timer_unit).setIcon(R.drawable.setting); // 按对应的名称增长子菜单 settingMenu.add(1, SETTING_SECOND_ID, 0, R.string.menu_setting_second); settingMenu.add(1, SETTING_100MILLISECOND_ID, 1, R.string.menu_setting_100milisec); // 退出 menu.add(0, EXIT_ID, 2, R.string.menu_exit).setIcon(R.drawable.exit);
选择菜单
public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case SETTING_TIMER_UNIT_ID: break; case EXIT_ID: finish(); // 退出应用 break; case SETTING_SECOND_ID: // 秒 if (SETTING_SECOND_ID != settingTimerUnitFlg) { mlTimerUnit = 1000; settingTimerUnitFlg = SETTING_SECOND_ID; } tvTime.setText(R.string.init_time_second); break; case SETTING_100MILLISECOND_ID: // 100毫秒 if (SETTING_100MILLISECOND_ID != settingTimerUnitFlg) { mlTimerUnit = 100; settingTimerUnitFlg = SETTING_100MILLISECOND_ID; } tvTime.setText(R.string.init_time_100millisecond); break; default: break; }
遇到的问题
菜单项如今显示不出来,本来最初仍是右上角有三个点的菜单项,可是奇妙的是过了一段时间后运行发现那个菜单项不显示了,开始觉得是代码出错了,检查以后发现没有问题,以为多是系统不显示了,网上有不少解决这个问题的办法,但尝试屡次后都没有用,而后又尝试了使用不一样的方法建立菜单,结果都不显示,后来看到这篇文章安卓模拟器的菜单键找不到在什么位置,以为我可能跟这个同样吧,后来又查找到在虚拟机上运行时,按快捷键Ctrl+M能够显示菜单,尝试以后个人菜单项终于出来了!虽然仍是不能直接显示。
这个APP的功能不多,待改进的地方不少,应该说从一开始就没想着作一个很复杂的APP,对本身的要求过低了。可是从这个过程当中仍是学到了一些技巧,但愿之后能继续加油,争取作处更好的。