手动输入未保存在Android的DatePicker(对话框)中

时间:2012-02-29 19:45:38

标签: android dialog datepicker

在Android中实施DatePickerDatePickerDialog非常简单。但是在数据存储方面,我遇到了这些类的问题:

如果您使用微调器(+或 - 按钮)更改日期,一切正常。调用“更改日期”或“日期设置”事件,您可以获取用户输入的值。

但是当年份被手动输入到输入字段(通过键盘)并且用户然后在对话框中单击“保存”时,将不会调用任何事件,您将无法获得手动输入的值。< / p>

仅当用户在手动输入年份后再次使用滑块更改某些内容时,它才有效。因为当您使用滑块时,会触发事件。

这是正常行为吗?如何实现所需的行为,即当用户手动输入某个内容然后单击“保存”时会触发事件?

提前致谢!

3 个答案:

答案 0 :(得分:8)

只需清除焦点,android就会设置手动输入的数字。

例如:

DatePicker datePicker = fidnViewById(R.id.dp);

保存就像onClick()一样,添加 datePicker.clearFocus();

这必须有效。

答案 1 :(得分:1)

我遇到了同样的问题,接受的答案对我帮助很大。当我使用DatePickerDialog时,我的情况有点不同。以下是DatePicker最终正常运作的方式。

首先声明变量,然后定义它们。

private DatePickerDialog.OnDateSetListener date;
private DatePickerDialog mDatePickerDialog;
private Calendar myCalendar;

// Get the calendar instance
myCalendar = Calendar.getInstance();

// Define the date set listener first.
date = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
        int dayOfMonth) {
        // Do something with year, monthOfYear and dayOfMonth
    }
};

// Now define the DatePickerDialog
mDatePickerDialog = new DatePickerDialog(context, date, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
mDatePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Set", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface arg0, int arg1) {
        DatePicker datePicker = mDatePickerDialog.getDatePicker();

        // The following clear focus did the trick of saving the date while the date is put manually by the edit text.
        datePicker.clearFocus();
        date.onDateSet(datePicker, datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth());
    }
});

然后在按钮的onClick

mDatePickerDialog.show();

答案 2 :(得分:0)

如果你查看Date Picker Example,只要用户点击对话框上的“SET”按钮,就会收到DatePickerDialog.OnDateSetListener回调。

查看下面的对话框

enter image description here

即使您使用键盘输入日期,只有在单击对话框中的“SET”按钮并且调用DatePickerDialog.OnDateSetListener回调时,才会接受日期本身。