このようなダイアログのカスタム実装を使用したくない場合は、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();
}
}
};