範例內容跟 Android Developer 官方的範例其實有點類似
不過我個人傾向的事件寫法是在別的地方寫好 function
然後在設定 onClick 之類的事件時再指定到我寫好的 function
官方範例用下面這種寫法我覺得會讓程式碼很亂....
1 2 3 4 5 6 7 8 9 |
pucliv onCreate() { ... mPickDate.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { showDialog(DATE_DIALOG_ID); } }); ... } |
同樣的語法我會寫成下面這樣,把事件的函式內容額外放...
1 2 3 4 5 6 7 8 9 10 11 |
public void onCreate() { ... mPickDate.setOnClickListener(mPickDateOnClick); ... } private View.OnClickListener mPickDateOnClick = new View.OnClickListener () { public void onClick(View v) { showDialog(DATE_DIALOG_ID); } } |
以下是完整的程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
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 的顯示方式~。
沒有留言:
張貼留言