(一)在Android 4.0以上系統的某些手機(如本人的測試機紅米Note(系統4.4.4),以及模擬器(系統4.0)),使用如下代碼創建時間選擇器時,頁面效果如圖:
Calendar cal = Calendar.getInstance(); DatePickerDialog dialog =new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener(){ @Override publicvoid onDateSet(DatePicker view,int year,int monthOfYear,int dayOfMonth){ System.out.println("onDateSet~~onDateSet~~"); } }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
問題來了,對話框上沒有“取消”按鈕!而且,即使通過返回鍵或者點擊空白區域關閉了對話框,onDateSet方法依然會被回調,也就是上述代碼中的onDateSet~~onDateSet~~這個log依然會輸出!
仔細測試后會發現,點擊返回鍵或者空白區域以關閉對話框時,onDateSet會被回調一次;點擊“完成”按鈕時,onDateSet會被回調兩次。奇葩!!!
后來又測試發現,這段代碼在基於android 5.0的CM系統上是沒有問題的:對話框上面有“完成”按鈕和“取消”按鈕,點擊“完成”時onDateSet被回調一次,點擊“取消”時onDateSet不會被回調。這才是最好的效果!
(二)其實,想在對話框上加一個取消按鈕很簡單,加上如下代碼即可:
dialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消",new DialogInterface.OnClickListener(){ @Override publicvoid onClick(DialogInterface dialog,int which){ System.out.println("cancel~~cancel~~"); } });
然后效果圖:
但是,問題並沒有解決。因為即使點擊取消按鈕,onDateSet方法依然會被回調。也就是說,點擊“取消”、點擊手機返回鍵、點擊空白區域這3種操作的結果是一樣的!
(三)解決方案:
很簡單,不使用OnDateSetListener,而直接手動設置“完成”按鈕和“取消”按鈕的事件。完整代碼如下:
publicvoid pickDate(View view){ Calendar cal = Calendar.getInstance(); final DatePickerDialog mDialog =new DatePickerDialog(this,null, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); //手動設置按鈕 mDialog.setButton(DialogInterface.BUTTON_POSITIVE,"完成",new DialogInterface.OnClickListener(){ @Override publicvoid onClick(DialogInterface dialog,int which){ //通過mDialog.getDatePicker()獲得dialog上的DatePicker組件,然后可以獲取日期信息 DatePicker datePicker = mDialog.getDatePicker(); int year = datePicker.getYear(); int month = datePicker.getMonth(); int day = datePicker.getDayOfMonth(); System.out.println(year +","+ month +","+ day); } }); //取消按鈕,如果不需要直接不設置即可 mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消",new DialogInterface.OnClickListener(){ @Override publicvoid onClick(DialogInterface dialog,int which){ System.out.println("BUTTON_NEGATIVE~~"); } }); mDialog.show(); }
