倒计时功能在开发中还是比较常见的一个功能,手机号登陆、注册,等页面常用,不知道大家用的什么方式来实现的,现在我把我的实现方式分享给大家
TimeCount.getInstance(60000, 1000, tv_send, this).start();
/**
* 倒计时功能类
* @author zhangyuhua
*
*需要注意:
* 1 控件必须使用 TextView (也可以使用其他的 需要将本类中的TextView 替换掉)
* 2 onFinish()中 的background 需要图片
*使用方式 如:TimeCount.getInstance(60000, 1000, tv_send, this).start();
*/
@SuppressLint("NewApi")
public class TimeCount extends CountDownTimer {
public static TimeCount time;
private Context context; //上下文
private TextView textView; // 点击获取验证码的按钮
public TimeCount(long millisInFuture, long countDownInterval,TextView textView,Context context) {
super(millisInFuture, countDownInterval);
this.context= context;
this.textView=textView;
}
@Override
public void onTick(long millisUntilFinished){
textView.setClickable(false);
//设置背景颜色 这里用的是shape-
textView.setBackground(context.getResources().getDrawable(R.drawable.shape_tv_bg_green));
textView.setText(millisUntilFinished /1000+"s ");
}
@Override
public void onFinish(){
textView.setText("重新获取验证码");
textView.setClickable(true);
//设置背景颜色 这里用的是shape
textView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.shape_tv_bg_green));
}
//单例
public synchronized static TimeCount getInstance(long millisInFuture, long countDownInterval,TextView textView,Context context){
if(time==null){
time=new TimeCount(millisInFuture, countDownInterval, textView, context);
}
return time;
}
}
用起来挺方便的,使用过程中会有个小bug : 返回上一个界面后再进入注册页面时点击发送验证码时 ,无任何改变。
这个小bug也简单。因为CountDownTimer 的cancel 在androidStudio中实效了,怎么办?;
经过多次测试发现,在活动Activity结束前 调用一下TimeCount的onFinish() 方法后该功能一切可以正常。那么我们可以做如下操作,
1、在 TimeCount中 添加一个状态值 status ,默认等于0,在onFinish(),方法中进行判断
@Override
public void onFinish(){
if (status==0){
textView.setText("重新获取验证码");
}else {
textView.setText("发送验证码");
}
textView.setClickable(true);
//设置背景颜色 这里用的是shape 假如美工给出的背景色有两种是在这里进行设置(可点击色)
textView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.shape_tv_bg_green));
}
2、在TimeCount中添加一个 充值方法 resetting();
/**
* 当计时器未结束时页面突然关闭时调用此方法
*/
public void resetting(){
this.status=1;
onFinish();
cancel();
}
resetting() 方法调用之后这个Bug就可以解决了。
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.CountDownTimer;
import android.widget.TextView;
import test.zyh.cn.com.testandroid.R;
/**
* 倒计时功能类
* @author zhangyuhua
*
*需要注意:
* 1 控件必须使用 TextView (也可以使用其他的 需要将本类中的TextView 替换掉)
* 2 onFinish()中 的background 需要图片
*使用方式 如:TimeCount.getInstance(60000, 1000, tv_send, this).start();
*/
@SuppressLint("NewApi")
public class TimeCount extends CountDownTimer {
public static TimeCount time;
private Context context;
private TextView textView;
private int status = 0; //当status == 0的时候是正常状态,其他值为非正常
public TimeCount(long millisInFuture, long countDownInterval,TextView textView,Context context) {
super(millisInFuture, countDownInterval);
this.context= context;
this.textView=textView;
}
@Override
public void onTick(long millisUntilFinished){
textView.setClickable(false);
//设置背景颜色 这里用的是shape 假如美工给出的背景色有两种是在这里进行设置(不可点击色)
textView.setBackground(context.getResources().getDrawable(R.drawable.shape_tv_bg_green));
textView.setText(millisUntilFinished /1000+"s ");
}
@Override
public void onFinish(){
if (status==0){
textView.setText("重新获取验证码");
}else {
textView.setText("发送验证码");
}
textView.setClickable(true);
//设置背景颜色 这里用的是shape 假如美工给出的背景色有两种是在这里进行设置(可点击色)
textView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.shape_tv_bg_green));
}
public synchronized static TimeCount getInstance(long millisInFuture, long countDownInterval,TextView textView,Context context){
if(time==null){
time=new TimeCount(millisInFuture, countDownInterval, textView, context);
}
return time;
}
/**
* 当计时器未结束时页面突然关闭时调用此方法
*/
public void resetting(){
this.status=1;
onFinish();
cancel();
}
}