【实习项目记录】(四)Android 实现手机验证时,按钮倒计时60s
手机注册一般都会有一个按钮,默认显示获取验证码,点击之后变成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相关推荐
- 【记录】 Android 双卡手机获取两个IMEI等
1.前言 项目中遇到上传手机imei的问题.如果手机是双卡,目前只能获取默认的imei [java] view plain copy TelephonyManager mTelephonyMg ...
- 【记录】 Android 双卡手机获取IMEI等
1.前言 项目中遇到上传手机imei的问题.如果手机是双卡,目前只能获取默认的imei TelephonyManager mTelephonyMgr = (TelephonyManager) getS ...
- android获取手机验证码界面以及倒计时实现demo,移动端应用开发试题
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', ...
- Android项目:基于Android的手机音乐播放器的设计
本次程序的设计,对手机音乐播放器的框架进行了精心的构思和实现,采用主要开发工具Eclipse+Java语言,Android Development Tool的插件和Android SDK版本来完成的. ...
- 【实习项目记录】(一)加密算法MD5和RSA
什么是md5加密? MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA ...
- 【边做项目边学Android】手机安全卫士09-手机防盗界面设置向导1
本次主要做手机防盗界面的设置向导功能界面的设计. 需求: 当用户进入手机防盗界面时,判断用户是否已经进行过设置向导: 如果用户已经设置过手机防盗,则不再提示用户进入手机向导 若还没有设置,则提示用户进 ...
- 【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡
上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用.这次要做设置向导界面的功能具体实现. 首先,4个界面分别是(重复度很大,这里就不再贴到正文中了) /mobilesafe/re ...
- 【边做项目边学Android】手机安全卫士07-手机防盗之进入限制
上次写到在进入手机但·防盗界面时需要有密码限制,首先第一次进入时会弹出对话框提示用户设置密码:再次进入时会要求用户输入密码:这次来具体实现上述功能. 首次登录,设置密码 首先,我们的密码是保存在Sha ...
- 【边做项目边学Android】手机安全卫士04_02:从服务器下载并安装新版本安装包
文件下载 1. 下载文件业务类 下载文件的操作也属于业务方法,所以在com.liuhao.mobilesafe.engine中创建一个DownloadFileTask下载文件的类. 其中的getFil ...
最新文章
- linux内核rcu锁实例,Linux Rcu到底有没有锁?
- JavaScript:事件冒泡和事件委托
- 局部类的引用成员函数或虚函数必须进行定义
- opencv运行时exe 无法写进去的解决方法
- 深度学习在自然语言处理的应用
- Python使用数字与字符串的技巧
- python3 链表_python3实现链表
- 设计模式中类之间的关系
- 高级ZK:异步UI更新和后台处理–第2部分
- Taro+react开发(8)--控制跳转
- js encodeurl java接收_在JS中encodeURI(url)怎样才能不出现乱码?
- 微软重新设计 Edge for Android 的用户界面
- kindle3 破解字体
- textContent与innerText
- Hibernate学习(八):检索方式
- 中国物流产业发展形势与竞争格局展望报告2022版
- 技术管理进阶——什么是影响力
- uc收藏导入html,uc浏览器的收藏网址如何导出方法
- Punti特征码定位器(原SignatureTest) 2022 Q1V1
- ORACLE 统计男女数量
热门文章
- 解读设计模式----策略模式(Strategy Pattern)
- 扔掉目标检测器,实现真正的端到端多模态预训练!阿里提出E2E-VLP(ACL2021)...
- 深度学习中Attention机制的“前世今生”
- 深度学习加持的工业AI质检
- 深度重建:基于深度学习的图像重建
- 游戏建模之3Dmax的重要性
- centos 6.4/6.5下源码编译安装mysql_CentOS 6.4/6.5下源码编译安装mysql
- 图机器学习有多大神力?一文带你回顾2020,展望2021
- java中生成pdf文件,java 中生成pdf 文件
- 小林菌2020总结,我差点没毕业~