选择取消按钮时如何重置DatePicker

时间:2011-11-22 12:06:47

标签: android

我的应用中有一个datePicker对话框。我选择日期时工作正常。但是,如果在对话框中我更改日期然后按取消,则原始edittext保持不变,但日期选择器仍然具有取消之前的日期。我想确保每次进入日期选择器时,它都会从EditText设置日期。我的代码如下。

onCreate()方法

//  Date Listener
    fdEtDate.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            showDialog(DATE_DIALOG_ID);
            return false;
        }
    });

进一步了解活动

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DATE_DIALOG_ID:
        return new DatePickerDialog(this,
                    dateSetListener,
                    cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
    case STD_DIALOG_ID:
        return new TimePickerDialog(this,
                    stdSetListener,
                    stdHH, stdMM,
                    true);
    case STA_DIALOG_ID:
        return new TimePickerDialog(this,
                    staSetListener,
                    staHH, staMM,
                    true);
    }
    return null;
}

// the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener dateSetListener =
    new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, 
                              int monthOfYear, int dayOfMonth) {
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, monthOfYear);
            cal.set(Calendar.DATE, dayOfMonth);
            updateDisplay();
        }
};
// updates the date in the TextView
private void updateDisplay() {
    fdEtDate.setText(
        new StringBuilder()
                .append(Utils.pad(cal.get(Calendar.DATE))).append(Const.SQL_DATE_SEP)
                .append(Utils.pad(cal.get(Calendar.MONTH)+1)).append(Const.SQL_DATE_SEP)
                .append(cal.get(Calendar.YEAR)));

    fdEtStd.setText(
        new StringBuilder()
                .append(Utils.pad(stdHH)).append(Const.SQL_TIME_SEP)
                .append(Utils.pad(stdMM)));

    fdEtSta.setText(
        new StringBuilder()
                .append(Utils.pad(staHH)).append(Const.SQL_TIME_SEP)
                .append(Utils.pad(staMM)));
}

似乎每次都会创建一个新的Dialog,那么为什么每次都没有使用fdEtDate(EditText)中的Date进行初始化

提前致谢

4 个答案:

答案 0 :(得分:8)

每次显示对话框时,都应使用 onPrepareDialog 设置初始日期。

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
    case START_DATE_DIALOG_ID:
        ((DatePickerDialog) dialog).updateDate(
            mCalendar.get(Calendar.YEAR),
            mCalendar.get(Calendar.MONTH),
            mCalendar.get(Calendar.DAY_OF_MONTH))
    }
}

只有在第一次显示对话框时才会创建对话框,除非您使用removeDialog()明确销毁它,否则将重复使用该对话框。

  

如果使用onCreateDialog(int)来管理对话框的状态(如上一节所述),那么每次关闭对话框时,Activity都会保留Dialog对象的状态。如果您决定不再需要此对象,或者清除状态很重要,那么您应该调用removeDialog(int)。这将删除对象的任何内部引用,如果对话框显示,它将忽略它

http://developer.android.com/guide/topics/ui/dialogs.html

答案 1 :(得分:0)

这可能是因为您在Calendar中更改了onDateSet对象的值。尝试通过向LogCat添加一些输出来验证方法何时被调用,例如Log.e( "MyTag", "onDateSet was called!" );。然后试验一下,看看它何时被召唤。

如果是这种情况,并且在您没有预料到时调用onDateSet,则应更改设置日历的时间。

答案 2 :(得分:0)

这很简单。

您可以使用以下方法重置日历

sc_X = StandardScaler()

通过这种方式,它非常容易并且完美地工作。

答案 3 :(得分:0)

要在取消时重置日期选择器,请点击:

  1. 在日期选择器上添加onDismissListner
  2. onDismissListener内,调用updateData方法

示例:

datePicker.setOnDismissListener((dialog) -> {
    datePicker.updateData(Year, Month, Date);
}

注意: 您可能以为用户单击Ok会导致此代码出现问题。理想情况下不会。在updateData中呼叫onDateSet时,不会有任何问题。