Обратите внимание, я заранее извиняюсь, если это уже там. Пытаясь понять это, я нашел фрагменты этого, но никогда не всю эту проблему и решение. Поэтому я подумал, что напишу об этом для остальной части сообщества.
В DatePickerDialogs есть много вопросов/ответов (и TimePickerDialogs о том, как зафиксировать дату/время, установленные с помощью onDateSet().
Я обнаружил нюанс в функциональности этого диалога, который выглядит как ошибка версии 17 и ниже, и нашел решение.
Вот проблема...
Как было сказано там, если вы хотите зафиксировать дату, установленную при выходе из DatePickerDialog, вы пишете и метод onDateSet() и устанавливаете прослушиватель в DatePickerDialog (обычно как «это»). Например:
public static class MyDatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
DatePickerDialog dialog = new DatePickerDialog(getActivity(), **this**, year, month, day);
return dialog;
}
public void onDateSet(DatePicker view, int year, int month, int day) {
blah blah blah
do the date setting code
}
}
Обратите внимание, что this передает MyDatePickerFragment в DatePickerDialog в качестве слушателя onDateSet().
Это отлично работает в версиях Android 17 и ниже. Попробуйте версию 18 или выше, и в основном ничего не происходит. Ваши действия по назначению даты теряются. Итак, еще одно предложение (я нашел) заключалось в том, чтобы добавить следующий код в onCreateDialog():
dialog.setButton(DialogInterface.BUTTON_NEGATIVE,
getString(R.string.btn_cancel),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which
{
if (which == DialogInterface.BUTTON_NEGATIVE) {
saved = false;
}
}
});
dialog.setButton(DialogInterface.BUTTON_POSITIVE,
getString(R.string.btn_done),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which
{
if (which == DialogInterface.BUTTON_POSITIVE) {
saved = true;
}
}
});
Это отлично работает для любой версии 18 или выше. Тем не менее, если вы просто добавите это в onCreateDialog(), ваша версия 17 и ниже перестанет работать. Закомментируйте этот код версии 17 и ниже. Вставил, выключается и 18+ работает.
Чтобы исправить это, я реализовал это следующим образом:
if(Build.VERSION.SDK_INT > 17) {
dialog.setButton(DialogInterface.BUTTON_NEGATIVE,
getString(R.string.btn_cancel),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which
{
if (which == DialogInterface.BUTTON_NEGATIVE) {
saved = false;
}
}
});
dialog.setButton(DialogInterface.BUTTON_POSITIVE,
getString(R.string.btn_done),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which
{
if (which == DialogInterface.BUTTON_POSITIVE) {
saved = true;
}
}
});
}
Вуаля...!! Теперь оба работают. Эта же парадигма работает и для TimePickerDialog.
Надеюсь, это поможет.