Несоответствие заголовка Android DatePickerDialog CalendarView

Я создаю DatePickerDialog, как это сделано в документации. Однако я заметил, что заголовок CalendarView (то есть «декабрь 2012», как это было бы на сегодняшний день) не меняется сразу, когда год устанавливается в Spinners. Я вижу, что недели изменены правильно, и я могу установить заголовок диалога на основе обратного вызова onSelectedDayChange с соответствующей датой (месяц, день месяца, год, день недели). Кроме того, если месяц изменяется в Spinners, то CalendarView обновляется немедленно. Это включает в себя правильное отображение выбранного года, если год был изменен до того, как был изменен месяц. И если CalendarView прокручивается до других месяцев, год также корректируется, чтобы показать правильный год.

Кажется, это означает, что CalendarView просто не перерисовывает заголовок (вероятно, оптимизация?), когда устанавливается дата. Я делаю что-то еще не так? Есть ли этому решение? Или это ошибка в реализации?

Вот мой код:

public class DatePickerFragment extends DialogFragment
    implements DatePickerDialog.OnDateSetListener {
    /** Name of the date stored in a {@link Bundle} */
    public static final String KEY_DATE = "key.DatePickerFragment.DATE";

    @Override
    public Dialog onCreateDialog(Bundle icicle) {
        final Bundle arguments = getArguments();
        Time date = arguments == null
                ? TimeMachine.getTimeFromArray(getArguments().getIntArray(KEY_DATE))
                : null;

        if (date == null)
            date = TimeMachine.getToday();

        _dialog_window = new DatePickerDialog(getActivity(), this, date.year, date.month, date.monthDay);
        final CalendarView calendar_view = _dialog_window.getDatePicker().getCalendarView();
        calendar_view.setOnDateChangeListener(
                new CalendarView.OnDateChangeListener() {
                    @Override
                    public void onSelectedDayChange(CalendarView _, int year, int month, int day) {
                        updateTitle(TimeMachine.getTimeFromArray(new int[]{ year, month, day }));
                    }
                }
        );

        // Sets the title
        updateTitle(date);

        // Create a new instance of DatePickerDialog and return it
        return _dialog_window;
    }

    @Override
    public void onDateSet(DatePicker _, int year, int month, int day) {
        final Time date = new Time();
        date.set(day, month, year);
    }

    private void updateTitle(Time date) {        
        _dialog_window.setTitle(date.format(" %A,  %B %e, %Y"));
    }

    /** The Dialog window */
    private DatePickerDialog _dialog_window;
}

person Dandre Allison    schedule 18.12.2012    source источник


Ответы (2)


Я столкнулся с той же проблемой и отправил отчет об ошибке: http://code.google.com/p/android/issues/detail?id=53875

person Maarten Pennings    schedule 07.04.2013

Увидев, что других нет с каким-либо другим ответом, я обошел эту проблему, не включив CalendarView на DatePicker, а вместо этого создал собственный DialogFragment с числовым выбором даты и отдельным CalendarView (на самом деле моя собственная повторная реализация на основе на реальном CalendarView, чтобы разрешить настройку его дисплея и шины событий Otto). Затем я могу убедиться, что CalendarView устанавливается каждый раз, когда устанавливается числовое средство выбора даты.

person Dandre Allison    schedule 17.01.2013