/**
-
@author mao
-
@version v1.0
-
@date 2016/11/1 11:29
-
@des 该自定义控件为 获取验证码倒计时控件
-
必须调用setOnSendCheckCodeListener(OnSendCheckCodeListener listener) 方法
*/
public class CheckCodeCountDown extends TextView {
private boolean canSend = true;//默认可以发送 , 等计时结束时方可重新发送
public CheckCodeCountDown(Context context) {
this(context, null);
}
public CheckCodeCountDown(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CheckCodeCountDown(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
private OnFinishListener mFinishListener;//计时完成的监听
private OnSendCheckCodeListener mSendCheckCodeListener;//发送验证码的监听
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(“ss”);//将时间格式设置为 只显示 秒 的格式 eg : 59
long millTime = 60 * 1000; // 倒计时为 1 分钟
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
millTime -= 1000;//每次自减 1000 毫秒
if (millTime < 1000) {
//倒计时结束时 将handler中的消息及回调移除
handler.removeCallbacksAndMessages(null);
if (mFinishListener != null) {
mFinishListener.OnFinish();// 接口回调
}
canSend = true;//倒计时结束 , 可以重新发送
return;
}
date.setTime(millTime);
String string = sdf.format(date);//格式化时间
setText(string);//更新文本内容 , 即更新时间
updateTime();// 递归调用,循环更改时间
}
};
/**
- 开始发送验证码 , 这个类最核心的代码
*/
private void startSend() {
if (mSendCheckCodeListener == null) {
return;
}
mSendCheckCodeListener.sendCheckCode();
updateTime();
}
/**
- 更新时间的方法,核心是每隔 1000 毫秒 Handler发送一次消息
*/
private void updateTime() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 1000);
}
/**
-
设置倒计时时间的方法,单位是毫秒
-
@param millisecond 倒计时的时间,eg:倒计时为5000毫秒,则传5000即可
*/
public void setMillisecond(long millisecond) {
millTime = millisecond;
}
/**
-
设置倒计时结束的监听
-
在回调的OnFinish()方法中干你想干的事
*/
public void setOnFinishListener(OnFinishListener listener) {
mFinishListener = listener;
}
public interface OnFinishListener {
void OnFinish();
}
/**
-
设置发送验证码操作的回调
-
在回调的sendCheckCode()方法中执行发送验证码的操作
*/
public void setOnSendCheckCodeListener(OnSendCheckCodeListener listener) {
mSendCheckCodeListener = listener;
}
public interface OnSendCheckCodeListener {
void sendCheckCode();
}
/**
-
在该View的onClick方法中调用
-
@param phoneNumber
*/
public void performOnClick(boolean phoneNumber) {
if (!phoneNumber) {
Toast.makeText(getContext(), “手机号格式不正确”, Toast.LENGTH_SHORT).show();
return;
}
if (canSend) {
setMillisecond(60 * 1000); // 每次发送之前 要将倒计时的时间更新为最初的时间
startSend();//执行发送验证码的逻辑
canSend = false;// 1 分钟之内不能重复发送
}
}
}
用法如下:
package com.qj.checkcodecountdown;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private CheckCodeCountDown mCheckCodeCountDown;
private EditText mPhoneNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initListener();
}
private void initView() {
mCheckCodeCountDown = (CheckCodeCountDown) findViewById(R.id.checkcode);
mPhoneNumber = (EditText) findViewById(R.id.phone_number);
}
private void initData() {
}
private void initListener() {
mCheckCodeCountDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//必须调用 , 输入框中输入的是手机号 true , 否则 false ,这么做是为了防止不是手机号也进入倒计时
boolean phoneNumber = isPhoneNumber(mPhoneNumber.getText().toString());
mCheckCodeCountDown.performOnClick(phoneNumber);
}
});
mCheckCodeCountDown.setOnSendCheckCodeListener(new CheckCodeCountDown.OnSendCheckCodeListener() {
@Override
public void sendCheckCode() {
// TODO 向手机发送验证码的逻辑
}
});
mCheckCodeCountDown.setOnFinishListener(new CheckCodeCountDown.OnFinishListener() {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
2675798)]
[外链图片转存中…(img-Yw92pUo6-1715422675799)]
[外链图片转存中…(img-bKXdJ57V-1715422675800)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!