話不多說,直接上代碼
private EditText et;
private Button btn;
private static final String PHONE_PATTERN = "[1]{1}[3,4,5,8]{1}[0-9]{9}";
private static final String EMAIL_PATTERN = "^([a-zA-Z0-9]+[_|\\-|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\-|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$";
private int time = 120;
private Timer timer = new Timer();
TimerTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.edittext);
btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String s = et.getText().toString();
if(isValidPhone(s)){
Toast.makeText(MainActivity.this, "此處很可能是手機號", Toast.LENGTH_SHORT).show();
}else if(isValidEmail(s)){
Toast.makeText(MainActivity.this, "此處很可能是郵箱", Toast.LENGTH_SHORT).show();
}else{
btn.setEnabled(false);
task = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() { // UI thread
@Override
public void run() {
if (time <= 0) {
btn.setEnabled(true);
btn.setText("獲取驗證碼");
task.cancel();
} else {
btn.setText("" + time);
}
time--;
}
});
}
};
time = 10;
timer.schedule(task, 0, 1000);
}
}
});
}
private boolean isValidPhone(String phone) {
if (TextUtils.isEmpty(phone))
return false;
return phone.matches(PHONE_PATTERN);
}
private boolean isValidEmail(String email) {
if (TextUtils.isEmpty(email))
return false;
return email.matches(EMAIL_PATTERN);
}
代碼中加了個郵箱與手機號的判斷,分別有各自的方法,鞋友們可以參考,有更好更簡便更準確的還麻煩提醒一下。
此處用了timer.schedule(task, 0, 1000); 其中的參數第一個代表所執行的任務,第二個代表第一次執行的延遲時間,第三個代表多長時間執行一次。這段代碼需要注意的是任務可以取消,每次倒計時的時候都新建一個任務,但是別把timer取消了,否則會出錯。 一般最好的處理辦法就是加了個btn.setEnabled(false);來控制按鈕的點擊事件。
btn.setEnabled(false);
btn.setEnabled(false);