Android 사용자 정의 View 등록 인증 코드 카운트다운 버튼 가 져 오기

안 드 로 이 드 개발 에서 우 리 는 등록 기능 을 피 할 수 없다.현재 의 등록 대부분 은 핸드폰 으로 등록 되 어 있다.그러면 등록 할 때 인증 코드 를 받 는 방식 으로 검증 하 라 고 요구 할 것 이다.우 리 는 다음 에 사용자 정의 인증 코드 카운트다운 단 추 를 실전 해 보 자.
1.효과 도 를 먼저 본다

2.우리 가 관련 된 변수

//     ,   

/**
 *      ,       60 ;
 */
private long length = 60 * 1000;

//               

/**
 *                ,        
 */
private String beforeText = "     ";

//                      

/**
 *                       ,    
 */
private String afterText = " ";

3.어떤 카운트다운 타 이 머 를 이용 하 는가
자바 에서 타이머 작업 을 수행 하려 면 두 가지 기본 클래스 가 필요 합 니 다.
java.util.Timer;
java.util.TimerTask;
정시 작업 을 실행 하려 면 가장 기본 적 인 절 차 는 다음 과 같 습 니 다.
1.수행 할 작업 을 만 듭 니 다.Timer Task.
2.Timer 인 스 턴 스 를 만 들 고 Timer 가 제공 하 는 schedule()방법 을 통 해 Timer Task 를 타이머 Timer 에 추가 하고 실행 하 는 규칙 을 설정 하면 됩 니 다.
프로그램 이 Timer 초기 화 코드 를 실행 하면 Timer 정시 작업 은 설정 에 따라 실 행 됩 니 다.
Timer 의 schedule()방법 은 여러 가지 재 부팅 형식 으로 서로 다른 상황 에 적응 합 니 다.이 방법의 형식 은 다음 과 같다.
void schedule(TimerTask task, Date time)
지정 한 시간 에 지정 한 임 무 를 수행 하도록 안배 하 다.
void schedule(TimerTask task, Date firstTime, long period)
지정 한 작업 을 지정 한 시간 에 반복 되 는 고정 지연 실행 을 시작 하도록 설정 합 니 다.
void schedule(TimerTask task, long delay)
지정 지연 후 지정 한 작업 을 수행 하도록 배정 합 니 다.
void schedule(TimerTask task, long delay, long period)
지정 한 작업 을 지정 한 지연 후부 터 반복 되 는 고정 지연 실행 을 진행 하도록 배정 합 니 다.
Timer 는 스 레 드 가 안전 합 니 다.동시에 배정 되 는 작업 으로 확장 할 수 있 습 니 다(수천 개 에 문제 가 없습니다).모든 구조 방법 이 타이머 스 레 드 를 시작 합 니 다.cancel()을 호출 하여 이 타 이 머 를 종료 하고 현재 설정 한 모든 작업 을 버 릴 수 있 습 니 다.Purge()이 타이머 의 작업 대기 열 에서 취 소 된 모든 작업 을 제거 합 니 다.이 는 실시 간 보증 을 제공 하지 않 습 니 다.Object.wait(long)방법 으로 작업 을 배정 합 니 다.
Timer Task 는 추상 적 인 클래스 로 Timer 가 한 번 에 실행 하거나 반복 하 는 작업 으로 배정 합 니 다.그것 은 추상 적 인 방법 인 run()-타이머 임무 가 수행 해 야 할 조작 이 있다.따라서 모든 구체 적 인 작업 클래스 는 Timer Task 클래스 를 계승 하고 run()방법 을 다시 써 야 합 니 다.그리고 그것 은 두 가지 추상 적 이지 않 은 방법 이 있다.
boolean cancel()
이 타이머 작업 을 취소 합 니 다.
long scheduledExecutionTime()
이 작업 의 최근 실제 실행 시간 을 되 돌려 줍 니 다.
4.코드

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;

import java.util.Timer;
import java.util.TimerTask;

/**
 *         
 * <p/>
 *
 * @author Dylan
 *     [       BUG]
 *     Created by Dylan on 2016/10/5 0005.
 */
public class CountdownButton extends Button implements View.OnClickListener {
  /**
   *      ,       60 ;
   */
  private long length = 60 * 1000;
  /**
   *         ,           
   */
  private Timer timer;
  /**
   *               
   */
  private TimerTask timerTask;
  /**
   *                ,        
   */
  private String beforeText = "     ";
  /**
   *                       ,    
   */
  private String afterText = " ";
  /**
   *       
   */
  private OnClickListener onClickListener;


  public CountdownButton(Context context) {
    super(context);
    initView();
  }

  public CountdownButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView();
  }

  public CountdownButton(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView();
  }

  /**
   *      
   */
  private void initView() {
    if (!TextUtils.isEmpty(getText())) {
      beforeText = getText().toString().trim();
    }
    this.setText(beforeText);
    setOnClickListener(this);
  }

  /**
   *      
   */
  private void initTimer() {
    timer = new Timer();
    timerTask = new TimerTask() {
      @Override
      public void run() {
        handler.sendEmptyMessage(1);
      }
    };
  }

  /**
   *        
   *
   * @param length     
   */
  public void setLength(long length) {
    this.length = length;
  }

  /**
   *            
   *
   * @param beforeText
   */
  public void setBeforeText(String beforeText) {
    this.beforeText = beforeText;
  }

  /**
   *            
   *
   * @param beforeText
   */
  public void setAfterText(String beforeText) {
    this.afterText = afterText;
  }

  /**
   *           
   *
   * @param onclickListener
   */
  @Override
  public void setOnClickListener(OnClickListener onclickListener) {
    if (onclickListener instanceof CountdownButton) {
      super.setOnClickListener(onclickListener);
    } else {
      this.onClickListener = onclickListener;
    }
  }

  /**
   *         
   *
   * @param v
   */
  @Override
  public void onClick(View v) {
    start();
    if (onClickListener != null) {
      onClickListener.onClick(v);
    }
  }

  /**
   *      
   */
  public void start() {
    initTimer();
    this.setText(length / 1000 + afterText);
    this.setEnabled(false);
    timer.schedule(timerTask, 0, 1000);
  }


  /**
   *        
   */
  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      CountdownButton.this.setText(length / 1000 + afterText);
      length -= 1000;
      if (length < 0) {
        CountdownButton.this.setEnabled(true);
        CountdownButton.this.setText(beforeText);
        clearTimer();
        length = 60 * 1000;
      }
    }
  };

  /**
   *      
   */
  private void clearTimer() {
    if (timerTask != null) {
      timerTask.cancel();
      timerTask = null;
    }
    if (timer != null) {
      timer.cancel();
      timer = null;
    }
  }

  /**
   *       activity  fragment          ,
   *                   ,
   *             
   */
  @Override
  protected void onDetachedFromWindow() {
    clearTimer();
    super.onDetachedFromWindow();
  }
}

5.용법,아주 간단

 <com.bm.ykzx.view.CountdownButton
        android:id="@+id/cdb_register_timer"
        android:layout_width="120dp"
        android:textAllCaps="false"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:gravity="center"
        android:paddingLeft="3dp"
        android:paddingRight="3dp"
        android:text="     "
        android:textColor="#1179c4"
        android:textSize="@dimen/txt14sp" />
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기