手机注册一般都会有一个按钮,默认显示获取验证码,点击之后变成xx秒之后重新获取验证码

在网上查到有两种方法可以实现这种功能,一种是自定义一个timeButton,另外一种是利用封装好的60秒获取验证码工具类

第一种,首先在App.java类中添加一行代码

public static Map<String, Long> map;//用来存放倒计时的时间

然后将TimeButton类加入到工程中,时间默认是60s,也可以随后通过set方法,在代码中修改

package net.zhomi.negotiation.view.utils;import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;import net.zhomi.negotiation.app.App;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;
import android.widget.Toast;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;private Context mContext;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);mContext = context;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() {@Overridepublic void run() {Log.e("yung", time / 1000 + "");han.sendEmptyMessage(0x01);}};}private void clearTimer() {Toast.makeText(mContext, "计时结束", Toast.LENGTH_SHORT).show();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(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;}/**
*/
}

TimeButton在资源文件中的使用与Button并没有太大的不同

<net.zhomi.negotiation.view.utils.TimeButton//TimeButton所在的包android:id="@+id/btn_getcode"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginRight="15dp"android:layout_weight="2"android:background="@null"android:singleLine="true"android:text="60秒后重新获取"android:textColor="@color/balck"android:textSize="@dimen/normal_text_size" />

第二种

首先看封装的工具类

package com.example.timebtn;import android.os.CountDownTimer;
import android.widget.Button;public class TimerCount extends CountDownTimer {private Button bnt;public TimerCount(long millisInFuture, long countDownInterval, Button bnt) {super(millisInFuture, countDownInterval);this.bnt = bnt;}public TimerCount(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);// TODO Auto-generated constructor stub
    }@Overridepublic void onFinish() {// TODO Auto-generated method stubbnt.setClickable(true);bnt.setText("获取验证码");}@Overridepublic void onTick(long arg0) {// TODO Auto-generated method stubbnt.setClickable(false);bnt.setText(arg0 / 1000 + "秒后重新获取");}
}

如何使用:

Button btn = (Button) findViewById(R.id.button1);
TimerCount timer = new TimerCount(60000, 1000, btn);
timer.start();

看起来第二种的代码更简单,但是还是建议用第一种。

转载于:https://www.cnblogs.com/six-moon/p/4652085.html

【实习项目记录】(四)Android 实现手机验证时,按钮倒计时60s相关推荐

  1. 【记录】 Android 双卡手机获取两个IMEI等

    1.前言 项目中遇到上传手机imei的问题.如果手机是双卡,目前只能获取默认的imei [java] view plain copy     TelephonyManager mTelephonyMg ...

  2. 【记录】 Android 双卡手机获取IMEI等

    1.前言 项目中遇到上传手机imei的问题.如果手机是双卡,目前只能获取默认的imei TelephonyManager mTelephonyMgr = (TelephonyManager) getS ...

  3. android获取手机验证码界面以及倒计时实现demo,移动端应用开发试题

    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', ...

  4. Android项目:基于Android的手机音乐播放器的设计

    本次程序的设计,对手机音乐播放器的框架进行了精心的构思和实现,采用主要开发工具Eclipse+Java语言,Android Development Tool的插件和Android SDK版本来完成的. ...

  5. 【实习项目记录】(一)加密算法MD5和RSA

    什么是md5加密? MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA ...

  6. 【边做项目边学Android】手机安全卫士09-手机防盗界面设置向导1

    本次主要做手机防盗界面的设置向导功能界面的设计. 需求: 当用户进入手机防盗界面时,判断用户是否已经进行过设置向导: 如果用户已经设置过手机防盗,则不再提示用户进入手机向导 若还没有设置,则提示用户进 ...

  7. 【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

    上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用.这次要做设置向导界面的功能具体实现. 首先,4个界面分别是(重复度很大,这里就不再贴到正文中了) /mobilesafe/re ...

  8. 【边做项目边学Android】手机安全卫士07-手机防盗之进入限制

    上次写到在进入手机但·防盗界面时需要有密码限制,首先第一次进入时会弹出对话框提示用户设置密码:再次进入时会要求用户输入密码:这次来具体实现上述功能. 首次登录,设置密码 首先,我们的密码是保存在Sha ...

  9. 【边做项目边学Android】手机安全卫士04_02:从服务器下载并安装新版本安装包

    文件下载 1. 下载文件业务类 下载文件的操作也属于业务方法,所以在com.liuhao.mobilesafe.engine中创建一个DownloadFileTask下载文件的类. 其中的getFil ...

最新文章

  1. linux内核rcu锁实例,Linux Rcu到底有没有锁?
  2. JavaScript:事件冒泡和事件委托
  3. 局部类的引用成员函数或虚函数必须进行定义
  4. opencv运行时exe 无法写进去的解决方法
  5. 深度学习在自然语言处理的应用
  6. Python使用数字与字符串的技巧
  7. python3 链表_python3实现链表
  8. 设计模式中类之间的关系
  9. 高级ZK:异步UI更新和后台处理–第2部分
  10. Taro+react开发(8)--控制跳转
  11. js encodeurl java接收_在JS中encodeURI(url)怎样才能不出现乱码?
  12. 微软重新设计 Edge for Android 的用户界面
  13. kindle3 破解字体
  14. textContent与innerText
  15. Hibernate学习(八):检索方式
  16. 中国物流产业发展形势与竞争格局展望报告2022版
  17. 技术管理进阶——什么是影响力
  18. uc收藏导入html,uc浏览器的收藏网址如何导出方法
  19. Punti特征码定位器(原SignatureTest) 2022 Q1V1
  20. ORACLE 统计男女数量

热门文章

  1. 解读设计模式----策略模式(Strategy Pattern)
  2. 扔掉目标检测器,实现真正的端到端多模态预训练!阿里提出E2E-VLP(ACL2021)...
  3. 深度学习中Attention机制的“前世今生”
  4. 深度学习加持的工业AI质检
  5. 深度重建:基于深度学习的图像重建
  6. 游戏建模之3Dmax的重要性
  7. centos 6.4/6.5下源码编译安装mysql_CentOS 6.4/6.5下源码编译安装mysql
  8. 图机器学习有多大神力?一文带你回顾2020,展望2021
  9. java中生成pdf文件,java 中生成pdf 文件
  10. 小林菌2020总结,我差点没毕业~