DatePickerDialog и TimePickerDialog onXXXSet() Версия 17 +/- Проблема

Обратите внимание, я заранее извиняюсь, если это уже там. Пытаясь понять это, я нашел фрагменты этого, но никогда не всю эту проблему и решение. Поэтому я подумал, что напишу об этом для остальной части сообщества.

В 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.

Надеюсь, это поможет.


person Tek Tengu    schedule 30.04.2015    source источник


Ответы (1)


Смотрите мой ответ выше.

Прошу прощения, я не знал, что место «ответьте на свой вопрос» теперь здесь...

person Tek Tengu    schedule 30.04.2015