2011年2月18日 星期五

DatePicker 和 Button Click 的小範例

範例內容跟 Android Developer 官方的範例其實有點類似
不過我個人傾向的事件寫法是在別的地方寫好 function
然後在設定 onClick 之類的事件時再指定到我寫好的 function
官方範例用下面這種寫法我覺得會讓程式碼很亂....

pucliv onCreate() {
  ...
  mPickDate.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      showDialog(DATE_DIALOG_ID);
    }
  });
  ...
}


同樣的語法我會寫成下面這樣,把事件的函式內容額外放...

public void onCreate() {
  ...
  mPickDate.setOnClickListener(mPickDateOnClick);
  ...
}

private View.OnClickListener mPickDateOnClick = new View.OnClickListener () {
  public void onClick(View v) {
    showDialog(DATE_DIALOG_ID);
  }
}

以下是完整的程式碼:

import java.util.Calendar;
import java.util.Locale;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;

public class NewOilRecord extends Activity {
  private int currentYear;
  private int currentMonth;
  private int currentDay;
 
  private Button dateSetButton;
 
  @Override
  public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.new_oil_record);
    this.findViews(); // 取得 views
    Locale.setDefault(Locale.TAIWAN); // 設定地區

    // 設定今天的日期
    Calendar cal = Calendar.getInstance();
    this.currentYear = cal.get(Calendar.YEAR);
    this.currentMonth = cal.get(Calendar.MONTH);
    this.currentDay = cal.get(Calendar.DAY_OF_MONTH);
    updateDateOfButton(R.id.addOilDateButton, this.currentYear, this.currentMonth, this.currentDay);

    // 設定 onClick 事件
    this.dateSetButton.setOnClickListener(dateSetButtonClick);
  }
 
  private void updateDateOfButton (int viewId, int year, int month, int day) {
    this.dateSetButton.append(year+"/"+month+"/"+day);
  }
 
  // ------------------------------ //
  // ----------- events ----------- //
  // ------------------------------ //
  // 當 DatePicker 對話框的 Set 按鈕被按下時的動作
  private DatePickerDialog.OnDateSetListener addOilDateSet = new DatePickerDialog.OnDateSetListener() {
    public void onDateSet(DatePicker picker, int year, int month, int day) {
      // 更新按鈕上顯示的日期
      updateDateOfButton(R.id.addOilAmount, year, ++month, day);
    }
  };

  // 當顯示日期的按鈕被按下時的動作
  private View.OnClickListener dateSetButtonClick = new View.OnClickListener() {
    public void onClick(View v) {
      // 呼叫內建函式顯示出對話框
      showDialog(R.id.addOilDateButton);
    }
  };

  // 當 showDialog 被呼叫時的動作
  public Dialog onCreateDialog (int id) {
    switch (id) {
      case R.id.addOilDateButton:
      // 若是 addOilDateButton 按鈕被按下,則建立一個 DatePicker 的對話框,並指定預設的日期
      return new DatePickerDialog(this, this.addOilDateSet, this.currentYear, this.currentMonth, this.currentDay);
    }
    return null;
  }
 
  // ---------------------------------- //
  // ----------- find views ----------- //
  // ---------------------------------- //
  private void findViews () {
    this.dateSetButton = (Button) this.findViewById(R.id.addOilDateButton);
  }
}

其中有一行 Locale.setDefault(Locale.TAIWAN); 意思是設定程式的位置,會影響到 DatePicker 的顯示方式~。

沒有留言: