话不多说直接上代码:
import android.os.CountDownTimer;
import android.widget.TextView;
public class SmsCodeHelper {
private final TextView textView;
private final long seconds;
public SmsCodeHelper(TextView text, long seconds) {
this.seconds = seconds;
this.textView = text;
}
public interface SmsTimerCall {
void call(boolean finished);
}
public void smsCodeGet(SmsTimerCall call) {
CountDownTimer timer = new CountDownTimer(this.seconds, 1000) {
@Override
public void onTick(long l) {
textView.setClickable(false);
textView.setEnabled(false);
textView.setText(String.format("%s秒后重试", l / 1000 + 1));
call.call(false);
}
@Override
public void onFinish() {
textView.setText("重新获取");
textView.setClickable(true);
textView.setEnabled(true);
call.call(true);
}
};
timer.start();
}
}
使用:
tvSms = fv(R.id.tv_sms_code_get);
tvSms.setEnabled(true);
tvSms.setClickable(true);
tvSms.setText("获取验证码");
tvSms.setOnClickListener((v) -> {
new SmsCodeHelper(tvSms, 6 * 1000L).smsCodeGet(finished -> {
});
});
解释:
为什么要+1: CountDownTimer 启动时就是 进行减一,如上设置的是6秒倒计时,但是开始的时候就只显示5,我这里是为了显示 6 ,因此做了+1的操作。