鉴于经常在注册获取验证码时候需要一个倒计时按钮觉得很麻烦,抽点时间写了一个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 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
*
* 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();
}
}
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
*
* 2015年1月14日[佛祖保佑 永无BUG]
*
* 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 map = new HashMap();
public TimeButton(Context context) {
super(context);
setOnClickListener(this);
onCreate();
}public TimeButton(Context context, AttributeSet attrs) {super(context, attrs);setOnClickListener(this);
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 HashMaphttp://download.csdn.net/detail/yung7086/8428517
原创地址
http://write.blog.csdn.net/postedit/43563033