一般的登錄註冊界面,都會有點擊按鈕發送驗證碼的過程,點擊完成之後註冊按鈕會出現倒計時的字樣。如圖所示:
點擊過程之後會出現倒計時,倒計時時不能點擊,過了倒計時可以重新獲取驗證碼。
首先創建一個類,繼承CountDownTimer類實現構造方法,重寫onTick()以及 onFinish()方法。代碼如下:
public class CountDownTimerUtils extends CountDownTimer { private TextView mTextView; /** * @param millisInFuture The number of millis in the future from the call * to {@link #start()} until the countdown is done and {@link #onFinish()} * is called. * @param countDownInterval The interval along the way to receive * {@link #onTick(long)} callbacks. */ public CountDownTimerUtils(TextView textView,long millisInFuture, long countDownInterval) { //這裏的構造方法需要加入一個參數,傳入一個TextView對象參數是爲了對這個TextView對象進行點擊事件的處理。 // millisInFuture是傳給onTick()的參數,countDownInterval是表示多長時間調用一次onTick()。即倒計時每隔多長時間 //調用onTick()方法,即倒計時時間每次顯示間隔多少秒。 super(millisInFuture, countDownInterval); mTextView=textView; } @Override public void onTick(long millisUntilFinished) {//該方法在倒計時時調用 mTextView.setClickable(false); //設置不可點擊 mTextView.setText(millisUntilFinished / 1000 + "秒後可重新發送"); //設置倒計時時間 mTextView.setBackgroundResource(R.drawable.bg_identify_code_press); //設置按鈕爲灰色,這時是不能點擊的 //如果想給按鈕上的字設置顏色可以進行以下操作: SpannableString spannableString = new SpannableString(mTextView.getText().toString()); //獲取按鈕上的文字 ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);//設置文本顏色 /** * public void setSpan(Object what, int start, int end, int flags) { * 主要是start跟end,start是起始位置,無論中英文,都算一個。 * 從0開始計算起。end是結束位置,所以處理的文字,包含開始位置,但不包含結束位置。 */ spannableString.setSpan(span, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//將倒計時的時間設置爲紅色 mTextView.setText(spannableString); } @Override public void onFinish() {//計時結束之後實現這個方法 mTextView.setText("重新獲取驗證碼"); mTextView.setClickable(true);//重新獲得點擊 mTextView.setBackgroundResource(R.drawable.bg_identify_code_normal);//還原背景色 } }同時,只需要在獲取短信的按鈕下調用該方法即可。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CountDownTimerUtils countDownTimerUtils = new CountDownTimerUtils(button, 20000, 1000); countDownTimerUtils .start(); Toast.makeText(MainActivity.this, "驗證碼已發送", Toast.LENGTH_SHORT).show(); } });相關的解釋都在代碼中顯示了。