【问题标题】:How to reset DatePicker when selecting cancel Button选择取消按钮时如何重置 DatePicker
【发布时间】:2011-11-22 12:06:47
【问题描述】:

我的应用中有一个 datePicker 对话框。当我选择一个日期时它工作正常。但是,如果在对话框中更改日期然后按取消,则原始编辑文本保持不变,但日期选择器仍然具有取消之前的日期。我想确保每次进入日期选择器时,它都会从 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)));
}

似乎每次都创建一个新对话框,那么为什么每次都没有使用 fdEtDate (EditText) 中的日期对其进行初始化

提前致谢

【问题讨论】:

    标签: android


    【解决方案1】:

    您应该在每次显示对话框时使用 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

    【讨论】:

    • 太棒了,这正是我想要的,你是明星。第一次工作。非常感谢您的及时回复。
    • 是的,谢谢,这很好用,但是当我当时编辑我的数据时,日期选择器会打开从我保存的数据中插入的当前日期。那么在编辑时如何在日期选择器对话框中获取最后添加的日期?
    • 如果您将日期保存在 mCalendar 上,那么当您在 onPrepareDialog 上检索它时,您应该在 mCalendar 上拥有最后保存的日期
    【解决方案2】:

    这很简单。

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

    public void resetDate(myDatePicker){
    
           Calendar now = Calendar.getInstance();
           this.myDatePicker.updateDate(now.get(now.YEAR), now.get(now.MONTH), now.get(now.DAY_OF_MONTH));
        }
    

    这种方式非常简单,而且效果很好。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不是我想要的。还是谢谢
      【解决方案4】:

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

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

      例子:

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

      注意: 您可能会认为用户点击Ok 此代码会出现问题。理想情况下不会。当您在onDateSet 中调用updateData 时,您不会遇到任何问题。

      【讨论】:

        猜你喜欢
        • 2021-09-01
        • 2020-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2019-03-25
        相关资源
        最近更新 更多