Android发送验证码的倒计时按钮

1 直接上图


2 原理

原理很简单,就是把相应的倒计时逻辑等封装到一个控件中,并向外部提供接口。

3 代码

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;

/**
 * 自定义控件,实现倒计时功能。
 * 
 * @author Admin
 * 
 */
public class DaoJiShi extends FrameLayout {

	private static final int jishi = 0x000;
	private SmartButton9 daojishi;
	private Handler handler;
	private Timer timer;
	private int allTime = 50;
	private DaoJiShiCallBack daojishicallback;

	public DaoJiShi(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.daojishi, this);
		initView();
		initHandler();
		initListerner();
	}

	public DaoJiShi(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.daojishi, this);
		initView();
		initHandler();
		initListerner();
	}

	public DaoJiShi(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.daojishi, this);
		initView();
		initHandler();
		initListerner();
	}

	public void initView() {
		daojishi = (SmartButton9) findViewById(R.id.daojishi_btn);
	}

	public void initListerner() {
		daojishi.setMyOnClick(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (daojishicallback != null) {
					if (daojishicallback.Start()) {
						// 手机号验证通过了,那么继续下面的操作。
					} else {
						// 手机号验证未通过,直接返回了,不执行下面的操作。
						return;
					}
				} else {
					// 回调接口为空,有问题,直接返回了,不执行下面的操作。
					return;
				}
				daojishi.setClickable(false);
				// 按钮按下时创建一个Timer定时器
				timer = new Timer();
				// 创建一个TimerTask
				// TimerTask是个抽象类,实现了Runnable接口,所以TimerTask就是一个子线程
				TimerTask timerTask = new TimerTask() {
					// 倒数allTime秒,默认50秒。
					int i = allTime;

					@Override
					public void run() {
						// Log.d("debug", "run方法所在的线程:"
						// + Thread.currentThread().getName());
						// 定义一个消息传过去
						Message msg = new Message();
						msg.what = i--;
						handler.sendMessage(msg);
						if (i < 0) {
							cancel();
						}
					}
				};
				// 定义计划任务,根据参数的不同可以完成以下种类的工作:
				// 1.schedule(TimerTask task, Date when) ー> 在固定时间执行某任务
				// 2.schedule(TimerTask task, Date when, long
				// period) ー> 在固定时间开始重复执行某任务,重复时间间隔可控
				// 3.schedule(TimerTask task, long delay) ー> 在延迟多久后执行某任务
				// 4.schedule(TimerTask task, long delay, long
				// period) ー> 在延迟多久后重复执行某任务,重复时间间隔可控
				timer.schedule(timerTask, 1, 1000);// 3秒后开始倒计时,倒计时间隔为1秒
			}
		});
	}

	public void initHandler() {
		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				daojishi.setText(msg.what + "秒后\n重新获取");
				if (daojishicallback != null) {
					daojishicallback.numChanged(msg.what);
				}
				if (msg.what == 0) {
					daojishi.setText("获取验证码");
					daojishi.setClickable(true);
					if (daojishicallback != null) {
						daojishicallback.End();
					}
				}
			}
		};
	}

	public void stop() {
		timer.cancel();
		daojishi.setText("获取验证码");
		daojishi.setClickable(true);
	}

	public void start() {
		daojishi.performClick();
	}

	public void setDaojishicallback(DaoJiShiCallBack daojishicallback) {
		this.daojishicallback = daojishicallback;
	}

	public void setAllTime(int allTime) {
		this.allTime = allTime;
	}

	/**
	 * 倒计时控件回调外部代码的接口。
	 * 
	 * @author Admin
	 * 
	 */
	public interface DaoJiShiCallBack {

		/**
		 * 点击按钮后,开始计时前调用的方法。
		 * 
		 * @return 返回true会开始计时,false会退出计时。
		 */
		public boolean Start();

		/**
		 * 结束啦。
		 */
		public void End();

		/**
		 * 数字发生变化了。
		 * 
		 * @param num
		 * @return
		 */
		public void numChanged(int num);

	}

}
4 工程下载

http://download.csdn.net/detail/zhounanzhaode/8986391

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是实现验证码登录获取验证码倒计时的程序代码: 1. 在布局文件中添加一个Button控件,用于点击获取验证码。 ``` <Button android:id="@+id/btn_get_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取验证码" /> ``` 2. 在Activity中实现倒计时功能和获取验证码的操作。 ``` public class MainActivity extends AppCompatActivity { private Button btnGetCode; private int countDownTime = 10; // 倒计时时间,单位为秒 private CountDownTimer countDownTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnGetCode = findViewById(R.id.btn_get_code); btnGetCode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getCode(); } }); } /** * 获取验证码 */ private void getCode() { // 生成验证码 String code = generateCode(); // 模拟发送验证码短信 Toast.makeText(this, "验证码发送到您的手机,请注意查收", Toast.LENGTH_SHORT).show(); // 启动倒计时 startCountDown(); } /** * 生成验证码 * * @return 验证码字符串 */ private String generateCode() { Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { sb.append(random.nextInt(10)); } return sb.toString(); } /** * 启动倒计时 */ private void startCountDown() { if (countDownTimer != null) { countDownTimer.cancel(); } countDownTimer = new CountDownTimer(countDownTime * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { btnGetCode.setEnabled(false); btnGetCode.setText(String.format(Locale.getDefault(), "重新获取(%ds)", millisUntilFinished / 1000)); } @Override public void onFinish() { btnGetCode.setEnabled(true); btnGetCode.setText("获取验证码"); } }; countDownTimer.start(); } } ``` 在getCode()方法中,我们可以调用generateCode()方法来生成随机验证码,并模拟发送短信的操作。然后调用startCountDown()方法启动倒计时。 在startCountDown()方法中,我们使用了Android系统提供的CountDownTimer类来实现倒计时功能。每秒钟更新一次UI,显示剩余时间,倒计时结束后恢复获取验证码按钮状态。 这样就实现获取验证码倒计时的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值