4

我已经使用此处DatePickerDialog显示的示例实现了一个。

在我的实现中,DatePickerDialog.OnDateSetListener我添加了验证逻辑来​​检查所选日期是否在特定范围内。

private final DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int y, int m,
            int d) {

            final Calendar calendar = Calendar.getInstance();
            calendar.set(y, m, d);
            Date date = calendar.getTime();

      if(!myValidationFunction(date)) {
        // date not within allowed range
        // cancel closing of dialog ?
      }
    }
};

我遇到的问题是当用户单击设置按钮时会自动关闭,如果验证规则失败DatePickerDialog,我想保持打开状态。DatePickerDialog

有谁知道DatePickerDialog当用户单击“设置”按钮时如何阻止关闭?

4

1 回答 1

5

从 API 11 开始,DatePicker 可以为您验证您的日期。

按照您参考的指南,在覆盖 onCreateDialog 时,获取 DatePicker 并设置最小和最大日期:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // no changes from guide ...
    final DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day);
    dialog.getDatePicker().setMinDate(minDate);
    dialog.getDatePicker().setMaxDate(minDate);
    return dialog;
}

这样用户就不会选择错误的日期,因此无需手动验证日期。

对于旧版本,您可以在允许关闭时使用布尔值进行控制,并实现您自己的逻辑。在这里,我尝试说明您需要在哪里扩展代码:

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day){

            @Override
            public void onBackPressed() {
                allowClose = true;
                super.onBackPressed();
            }

            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (which==DialogInterface.BUTTON_POSITIVE && validate()){
                    allowClose = true;
                }
                super.onClick(dialog, which);
            }

            @Override
            public void dismiss() {
                if (allowClose) {
                    super.dismiss();
                }
            }

        };

        return dialog;
    }

    private void onCancelBtnClick() {
        allowClose = true;
        dismiss();
    }
于 2013-04-16T10:39:18.620 回答