使用“今天”按钮更新 Android DatePickerDialog 中的日期而不关闭对话框

Update date in Android DatePickerDialog with Today button without closing dialog

我想要一个带有 "Today" 按钮的日期选择器对话框。如果我点击今天按钮,它应该将日期选择器重置为当前日期,而不关闭对话框。

我有以下代码:

Calendar today = Calendar.getInstance();

DatePickerDialog datePickerDialog = new DatePickerDialog(context, R.style.MyDialogStyle, date, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
datePickerDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "Today", (dialog, which) -> {
      datePickerDialog.updateDate(today.get(Calendar.YEAR), today.get(Calendar.MONTH), today.get(Calendar.DAY_OF_MONTH));
});
datePickerDialog.show();

预期行为:将日期选择器的日期设置为当前日期而不关闭对话框。

实际行为:对话框关闭,日期不变。

我也试过使用 new DatePickerDialog(...) 和

datePickerDialog.getDatePicker().init(today.get(Calendar.YEAR), today.get(Calendar.MONTH), today.get(Calendar.DAY_OF_MONTH), null);

但还是不行,只能关闭对话框。 我在这里错过了什么?

有没有办法在不关闭对话框的情况下以编程方式更新日期选择器的日期?

默认情况下,单击按钮还会调用 dismiss() 方法来关闭 DatePickerDialog。它也适用于用于 'Today' 的 DialogInterface.BUTTON_NEUTRAL 按钮。

避免这种情况的最简单方法可能是覆盖 DatePickerDialog.dismiss() 方法并在单击 'Today' 按钮时跳过调用 super.dismiss()。 这是我在 Kotlin 中用于相同目的的工作代码(Today 按钮用于 DatePickerDialog)。我使用 skipDismiss 标志来知道何时跳过解雇。

val datePickerDialog = object : DatePickerDialog(
        this@MainActivity,
        settings.currentTheme,
        DatePickerDialog.OnDateSetListener { _, chosenYear, chosenMonth, dayOfMonth ->
            calendar.set(Calendar.YEAR, chosenYear)
            calendar.set(Calendar.MONTH, chosenMonth)
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)
            text_view_chosen_date.text = SimpleDateFormat("dd/MM/yyyy", Locale.US).format(calendar.time)
        },
        calendar.get(Calendar.YEAR),
        calendar.get(Calendar.MONTH),
        calendar.get(Calendar.DAY_OF_MONTH)
) {
    override fun dismiss() {
        if (!skipDismiss) {
            super.dismiss()
        } else {
            skipDismiss = false
        }
    }
}

当然,'Today' 按钮侦听器在调用时应将 skipDismiss 标志设置为 true。这是我的代码:

datePickerDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "Today") { dialog, which ->
    val today = Calendar.getInstance()
    (dialog as DatePickerDialog).updateDate(
            today.get(Calendar.YEAR),
            today.get(Calendar.MONTH),
            today.get(Calendar.DAY_OF_MONTH)
    )
    skipDismiss = true;
}