Android手机验证码倒计时控件

/**

  • @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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值