如果您不想使用此類對話框的自定義實現,則必須繼承DatePickerDialog
以實現此類行爲。您不能阻止對話框僅以DatePickerDialog.OnDateSetListener
關閉。
不幸的是,對話框的實現隨不同的API級別而變化,所以用子類化來獲得所需的行爲並不是那麼簡單。你需要添加一些黑客來使其可靠工作。
我創建了一個示例實現,阻止對話框關閉,除非設置了適當的日期(或取消或返回按鈕被擊中)。調整它以向用戶顯示警報,最好的地方是onClick()
方法中的else分支。
class CheckingDatePickerDialog extends DatePickerDialog {
private int year;
private boolean cancel = false;
private boolean isCancelable = true;
CheckingDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
this.year = year;
}
CheckingDatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
super(context, theme, callBack, year, monthOfYear, dayOfMonth);
this.year = year;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// allow closing the dialog with cancel button
Button btn = getButton(BUTTON_NEGATIVE);
if (btn != null) {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel = true;
dismiss();
}
});
}
}
@Override
public void setCancelable(boolean flag) {
isCancelable = false;
super.setCancelable(flag);
}
@Override
public void onBackPressed() {
// allow closing the dialog with back button if the dialog is cancelable
cancel = isCancelable;
super.onBackPressed();
}
private boolean isOldEnough() {
// test if the date is allowed
return year <= 1994;
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// necessary for some Honeycomb devices
DatePicker dp = getDatePicker();
this.year = dp.getYear();
}
if (isOldEnough()) {
// OnDateSetListener is called in super.onClick()
super.onClick(dialog, which);
} else {
// place your alert here
}
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
// on some Honeycomb devices called only with the first change
// necessary for devices running Android 2.x
this.year = year;
super.onDateChanged(view, year, month, day);
}
@Override
public void dismiss() {
if (cancel || isOldEnough()) {
// do not allow the dialog to be dismissed unless a cancel or back button was clicked
super.dismiss();
}
}
};
感謝您的回答。正如你在第一種方法中所說的,當對話框出現時你如何處理onClick? – GoCrazy 2013-02-22 18:58:49
沒有必要單獨處理它與兩個按鈕設置和取消,並且當你設置日期它將在onDateSet處理Android – Pragnani 2013-02-22 19:04:14
處理是的,我知道這一點。但是我想要的是我必須在將它傳入onDataSet之前進行驗證。正如我在我的問題中解釋的。 – GoCrazy 2013-02-22 19:16:32