Android实现简单计时器功能
作者:Red&&Black 时间:2021-11-22 03:30:00
本文实例为大家分享了Android实现简单计时器的具体代码,供大家参考,具体内容如下
布局
在res/layout 下进行布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="0dp">
<TextView
android:text="00:00:00"
android:textSize="60sp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/timeView"/>
<Button
android:text="start"
android:onClick="onClickStart"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/start"/>
<Button
android:text="stop"
android:onClick="onClickStop"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/stop"/>
<Button
android:text="reset"
android:onClick="onClickReset"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/reset"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
MainActivity
package com.test;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private int seconds = 0;
private boolean running = false; //计时状态
private boolean wasRunning = false; //保存running的状态
//app进入后台,暂停计时
@Override
protected void onStop() {
super.onStop();
wasRunning = running;
running = false;
}
//重新进入app,开始计时
@Override
protected void onStart() {
super.onStart();
if(wasRunning) running = true;
}
//失去焦点(如分屏),暂停计时
@Override
protected void onPause() {
super.onPause();
wasRunning = running;
running = false;
}
//获得焦点,重新开始计时
@Override
protected void onResume() {
super.onResume();
if(wasRunning) running = true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取保存的状态
if(savedInstanceState!=null){
seconds = savedInstanceState.getInt("seconds");
running = savedInstanceState.getBoolean("running");
wasRunning = savedInstanceState.getBoolean("wasRunning");
}
runTime();
}
/**
*保存状态
*/
@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
super.onSaveInstanceState(saveInstanceState);
saveInstanceState.putInt("seconds",seconds);
saveInstanceState.putBoolean("running",running);
saveInstanceState.putBoolean("wasRunning",wasRunning);
}
/**
* 响应button的onClick事件
* 方法名和onClick的值一致
*/
public void onClickStart(View button){
running = true;
}
public void onClickStop(View button){
running = false;
}
public void onClickReset(View button){
running = false;
seconds = 0;
}
/**
* 注意 ui线程不能被堵塞,因此不能在ui线程中调用sleep方法
* 只允许ui线程更新界面,不能在后台线程更新界面
*
* ** 使用ui线程的Handler定时更新 **
* 将任务封装到 Runnable的run方法中 ,通过Handler的
* post(立即提交任务)或postDelayed(实现定时调度)方法提交到ui线程
*/
private void runTime(){
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
final TextView textView = findViewById(R.id.timeView);
int hour = seconds /3600%24;
int minute = seconds%3600/60;
String time = String.format("%02d:%02d:%02d",hour,minute,seconds%60);
textView.setText(time);
if(running) seconds++;
handler.postDelayed(this,1000);
}
}
);
}
}
测试
完成
来源:https://blog.csdn.net/m0_46267375/article/details/108777169
标签:Android,计时器
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#控制台进行文件读写的方法
2022-02-13 22:03:27
Android程序开发中单选按钮(RadioGroup)的使用详解
2023-09-18 03:43:39
![](https://img.aspxhome.com/file/2023/5/137955_0s.png)
Java Validation方法入参校验实现过程解析
2021-08-04 03:31:50
JSONObject toJSONString错误的解决
2021-09-14 07:17:32
MyBatis环境资源配置实现代码详解
2023-08-05 08:59:02
.NET实现父窗体关闭而不影响子窗体的方法
2022-10-06 20:56:04
![](https://img.aspxhome.com/file/2023/4/104264_0s.jpg)
java实现秒表功能
2023-07-06 05:55:13
![](https://img.aspxhome.com/file/2023/7/80877_0s.jpg)
Java Arrays.sort和Collections.sort排序实现原理解析
2022-11-01 01:53:57
![](https://img.aspxhome.com/file/2023/8/79298_0s.jpg)
SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2
2023-04-19 15:01:55
![](https://img.aspxhome.com/file/2023/6/68736_0s.png)
详解Mybatis注解写法(附10余个常用例子)
2023-01-19 03:39:53
![](https://img.aspxhome.com/file/2023/7/113187_0s.jpg)
Kotlin协程的启动方式介绍
2022-05-26 10:29:27
详解IntelliJ IDEA创建spark项目的两种方式
2023-12-05 05:48:21
![](https://img.aspxhome.com/file/2023/0/69660_0s.png)
解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题
2023-11-28 20:53:42
![](https://img.aspxhome.com/file/2023/3/60813_0s.png)
Java数组越界问题实例解析
2023-10-25 18:16:23
git自定义_动力节点Java学院整理
2021-06-11 22:05:49
![](https://img.aspxhome.com/file/2023/9/94349_0s.jpg)
Android非XML形式动态生成、调用页面的方法
2022-11-11 11:26:01
基于jdk动态代理和cglib动态代理实现及区别说明
2022-04-11 00:32:44
springboot中的静态资源加载顺序优先级
2023-08-24 11:12:31
![](https://img.aspxhome.com/file/2023/6/94206_0s.jpg)
java对象和json的来回转换知识点总结
2023-08-01 23:35:57
C# 显示、隐藏窗口对应的任务栏
2023-06-13 03:57:32
![](https://img.aspxhome.com/file/2023/3/87053_0s.png)