Android使用CountDownTimer模拟短信验证倒计时
在移动互联网时代,验证码已经成为了各种应用的常规功能。在手机应用中,恼人的验证码一般是收到短信然后输入或者是点击获取然后等待一定时间自动填入。而对于这种需要等待倒计时的场景,我们通常使用的是CountDownTimer计时器。
CountDownTimer是Android提供的一个计时器类,可以方便地实现一些倒计时的功能。它可以让我们指定一个倒计时总时间,以及每个时间间隔执行一些操作。
在短信验证的功能中,我们需要倒计时一定时间(如60秒),并且在倒计时过程中,禁止用户再次点击获取验证码等操作。在倒计时结束后,才能让用户继续操作。
首先,在xml文件中添加一个TextView用于显示倒计时的秒数,并添加一个Button用于触发倒计时计时器的开始。
<TextView
android:id="@+id/tv_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn_send_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取验证码"
/>
接着,在Activity中定义CountDownTimer对象,并定义相应的开始计时器和结束计时器的方法。在计时器中,我们需要指定总时间和每个时间间隔执行的操作。
private CountDownTimer mCountDownTimer;
private void startCountDown() {
mCountDownTimer = new CountDownTimer(60 * 1000, 1000) {//总计时1分钟,每隔1秒执行一次onTick方法
@Override
public void onTick(long millisUntilFinished) {//millisUntilFinished:倒计时剩余时间
mTvCountdown.setText(millisUntilFinished / 1000 + "秒");
mBtnSendCode.setEnabled(false);//禁止用户再次点击获取验证码
}
@Override
public void onFinish() {//倒计时结束后执行的操作
mTvCountdown.setText("获取验证码");
mBtnSendCode.setEnabled(true);//允许用户再次点击获取验证码
}
};
mCountDownTimer.start();
}
private void stopCountDown() {
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
mCountDownTimer = null;
}
mBtnSendCode.setEnabled(true);//计时器停止后允许用户再次点击获取验证码
mTvCountdown.setText("获取验证码");
}
当用户点击获取验证码的按钮时,我们可以调用startCountDown()方法开始倒计时计时器。
mTvCountdown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startCountDown();
}
});
当用户接收到验证码并填入后,我们可以手动调用stopCountDown()方法停止计时器。
mEtCode.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.toString().length() > 0) {
stopCountDown();
}
}
});
通过以上方式,我们就可以实现一个简单的短信验证倒计时的功能了。需要注意的是,在计时器结束后,需要重新设置Button的text和setEnabled状态,以供用户再次操作。同时,在stopCountDown()方法中也需要设置按钮的setEnabled状态,否则如果在倒计时过程中用户手动退出页面,下次再打开时按钮可能会处于灰色不可点击状态。
