Вот как выглядит новый виджет DatePickerDialog
по умолчанию, как он выглядит из Android 5.0 и более поздние версии:
Это не очень нравится моим руководителям проектов. То, что они хотят, это «старый стиль» выбора даты Holo, каким он был до Marshmallow & Lollipop. Что-то вроде этого:
Передо мной два варианта:
- Используйте существующий виджет календаря, разработанный кем-то другим, который выглядит так же, как и выше.
- Создайте свой собственный виджет календаря с полной функциональностью календаря.
Если мне нужно создать свой собственный виджет, то создать пользовательский интерфейс достаточно просто. Мой вопрос в том, как мне написать бизнес-логику для такого календаря, т.е. как мне подкрепить его реальными данными? Как учитывать високосные годы и количество дней в разных месяцах? Самое главное, мне нужно, чтобы три NumberPicker
s были синхронизированы, когда речь идет о минимальном и максимальном диапазоне. НЕ должна быть возможность прокрутки выходит за пределы мин. и макс. Это проблема, которую я не смог решить.
Вот что я сделал до сих пор:
- Я использовал виджет
NumberPicker
внутриDialogFragment
, и я использовалsetMinValue()
иsetMaxValue()
, чтобы установить диапазон каждогоNumberPicker
. Когда год меняется (скажем, с 2011 на 2012), я вычисляю количество дней в текущем месяце, используя
cal = new GregorianCalendar(y, m, d); daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
как описано здесь.
- Когда пользователь прокручивает с декабря на январь или с января на декабрь, я программно прокручиваю средство выбора года для увеличения или уменьшения соответственно, как описано здесь.
- Средства выбора дня, месяца и года не могут прокручиваться за пределы своих минимальных и максимальных значений с помощью
setWrapSelectorWheel()
.
Итак, мой вопрос: есть ли уже существующий виджет, такой как этот, который я могу использовать? В качестве альтернативы, есть ли способ поддержать NumberPicker
s реальными данными календаря и синхронизировать их прокрутку в пределах минимального и максимального диапазона дат? Пожалуйста, помогите мне. Все ответы будут оценены.
ИЗМЕНИТЬ:
Хотя данный ответ работает, стоит отметить, что есть еще лучший способ: обернуть ссылку DatePicker
в DialogFragment
.