鉴于经常在注册获取验证码时候需要一个倒计时按钮觉得很麻烦,抽点时间写了一个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;
- }
- 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.onCreate(savedInstanceState);
- 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);
- }
- public TimeButton(Context context, AttributeSet attrs) {
- super(context, attrs);
- setOnClickListener(this);
- }
- @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() {
- @Override
- public 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;
- }
- @Override
- public void setOnClickListener(OnClickListener l) {
- if (l instanceof TimeButton) {
- super.setOnClickListener(l);
- } else
- this.mOnclickListener = l;
- }
- @Override
- public 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(Bundle bundle) {
- 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;
- }
- /*
- *
- */
- }
代码有点烂了哈,,完成工程待上传
工程地址