对安卓获取验证码倒计时60秒Button按钮的简单封装

鉴于经常在注册获取验证码时候需要一个倒计时按钮觉得很麻烦,抽点时间写了一个TimeButton

开始一直为Button既要接受用户的onclick事件纠结,因为我封装的里面也是用onclick事件来实现点击效果的

这样势必有两个onclick事件而产生冲突,随后还是解决了,在封装的类里面定义了一个onlick变量储存用户的onclick

事件.而刚好本身的onclick事件和用户的是同步的只要到时候调用下就OK..

简述下特性,

TimeButton使用的时候跟普通Button一样没有冲突,

TimeButton在倒计时的时候返回了如果没有超过剩下的时间再次进入会继续跑时哦,

TimeButton里面完成了按钮的点击显示和倒计时逻辑,

TimeButton在activity销毁后也会销毁不会像线程一样还在后台跑,

TimeButton的显示文字和倒计时都可以自行设置当然也有默认的,
原创地址 http://blog.csdn.net/yung7086/article/details/43563033

贴出代码来,首先需要在Application定义一个Map 

public class App extends Application {

	// 用于存放倒计时时间
	public static Map<String, Long> map;
}
然后在activity如此使用
package com.yung.timebutton;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

/**
 * 测试主界面
 * 
 * @author yung
 *         <P>
 *         2015年1月14日 13:00:26
 */
public class MainActivity extends Activity implements OnClickListener {

	private TimeButton v;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		v = (TimeButton) findViewById(R.id.button1);
		v.setTextAfter("秒后重新获取").setTextBefore("点击获取验证码").setLenght(15 * 1000);
		v.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Toast.makeText(MainActivity.this, "这是处理调用者onclicklistnenr",
				Toast.LENGTH_SHORT).show();
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		v.onDestroy();
		super.onDestroy();
	}
}

接下来就是TimeButton的代码

package com.yung.timebutton;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 * 鉴于经常用到获取验证码倒计时按钮 在网上也没有找到理想的 自己写一个
 * 
 * 
 * @author yung
 *         <P>
 *         2015年1月14日[佛祖保佑 永无BUG]
 *         <p>
 *         PS: 由于发现timer每次cancle()之后不能重新schedule方法,所以计时完毕只恐timer.
 *         每次开始计时的时候重新设置timer, 没想到好办法初次下策
 *         注意把该类的onCreate()onDestroy()和activity的onCreate()onDestroy()同步处理
 * 
 */
public class TimeButton extends Button implements OnClickListener {
	private long lenght = 60 * 1000;// 倒计时长度,这里给了默认60秒
	private String textafter = "秒后重新获取~";
	private String textbefore = "点击获取验证码~";
	private final String TIME = "time";
	private final String CTIME = "ctime";
	private OnClickListener mOnclickListener;
	private Timer t;
	private TimerTask tt;
	private long time;
	Map<String, Long> map = new HashMap<String, Long>();

	public TimeButton(Context context) {
		super(context);
		setOnClickListener(this);
<pre code_snippet_id="599205" snippet_file_name="blog_20150206_3_9896981" class="java" name="code">                onCreate();
}public TimeButton(Context context, AttributeSet attrs) {super(context, attrs);setOnClickListener(this);
 <span style="white-space:pre">		</span>onCreate();
}@SuppressLint("HandlerLeak")Handler han = new Handler() {public void handleMessage(android.os.Message msg) {TimeButton.this.setText(time / 1000 + textafter);time -= 1000;if (time < 0) {TimeButton.this.setEnabled(true);TimeButton.this.setText(textbefore);clearTimer();}};};private void initTimer() {time = lenght;t = new Timer();tt = new TimerTask() {@Overridepublic void run() {Log.e("yung", time / 1000 + "");han.sendEmptyMessage(0x01);}};}private void clearTimer() {if (tt != null) {tt.cancel();tt = null;}if (t != null)t.cancel();t = null;}@Overridepublic void setOnClickListener(OnClickListener l) {if (l instanceof TimeButton) {super.setOnClickListener(l);} elsethis.mOnclickListener = l;}@Overridepublic void onClick(View v) {if (mOnclickListener != null)mOnclickListener.onClick(v);initTimer();this.setText(time / 1000 + textafter);this.setEnabled(false);t.schedule(tt, 0, 1000);// t.scheduleAtFixedRate(task, delay, period);}/** * 和activity的onDestroy()方法同步 */public void onDestroy() {if (App.map == null)App.map = new HashMap<String, Long>();App.map.put(TIME, time);App.map.put(CTIME, System.currentTimeMillis());clearTimer();Log.e("yung", "onDestroy");}/** * 和activity的onCreate()方法同步 */public void onCreate() {Log.e("yung", App.map + "");if (App.map == null)return;if (App.map.size() <= 0)// 这里表示没有上次未完成的计时return;long time = System.currentTimeMillis() - App.map.get(CTIME)- App.map.get(TIME);App.map.clear();if (time > 0)return;else {initTimer();this.time = Math.abs(time);t.schedule(tt, 0, 1000);this.setText(time + textafter);this.setEnabled(false);}}/** * 设置计时时候显示的文本 */public TimeButton setTextAfter(String text1) {this.textafter = text1;return this;}/** * 设置点击之前的文本 */public TimeButton setTextBefore(String text0) {this.textbefore = text0;this.setText(textbefore);return this;}/** * 设置到计时长度 * * @param lenght * 时间 默认毫秒 * @return */public TimeButton setLenght(long lenght) {this.lenght = lenght;return this;}/***/}
 

代码有点烂了哈,,完成工程待上传
工程地址

http://download.csdn.net/detail/yung7086/8428517 

原创地址
http://write.blog.csdn.net/postedit/43563033

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,以下是一个简单的示例代码,可以使用jQuery发送验证码倒计时60: HTML: ```html <input type="text" id="phone" placeholder="请输入手机号码"/> <button id="send-code">获取验证码</button> ``` JavaScript: ```javascript $(document).ready(function() { var count = 60; //倒计时初始值 var countdownTimer; //倒计时器 // 点击获取验证码按钮 $("#send-code").click(function() { var phone = $("#phone").val(); if (phone == "") { alert("请输入手机号码"); return; } // 发送验证码的逻辑 $.ajax({ url: "send_code.php", type: "POST", data: { phone: phone }, success: function(response) { if (response == "success") { // 发送成功,开始倒计时 startCountdown(); } else { alert("发送失败,请稍后重试"); } }, error: function() { alert("发送失败,请稍后重试"); } }); }); // 开始倒计时 function startCountdown() { count = 60; $("#send-code").prop("disabled", true); countdownTimer = setInterval(function() { count--; if (count <= 0) { clearInterval(countdownTimer); $("#send-code").prop("disabled", false).html("获取验证码"); } else { $("#send-code").html("重新发送(" + count + ")"); } }, 1000); } }); ``` 这段代码将会在用户点击获取验证码按钮之后,发送一个 AJAX 请求到 `send_code.php` 页面,然后开始倒计时60。在倒计时期间,按钮会显示当前倒计时数,直到倒计时结束。如果用户在倒计时期间再次点击获取验证码按钮,该按钮将会被禁用,直到倒计时结束。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值