Android: CalendarView OnDateChangeLIstener

Я уже реализовал этот прослушиватель, чтобы я мог что-то отображать при нажатии определенной даты, но проблема в том, что когда я просматриваю CalendarView down, он автоматически отображает что-то, но я ничего не нажимал, я просто прокручивал вниз до Другой месяц в CalendarView, а затем идет, скажем, Toast или Log, в зависимости от того, что мне кажется, это имеет смысл, поскольку сам слушатель запускает `onDateChange, и поскольку прокрутка вниз по календарю также изменяет выбранную дату). Поэтому мой вопрос заключается в том, что есть какой-либо прослушиватель для CalendarView, который я мог бы использовать только как альтернативу слушателю ondateChange, чтобы избежать ситуации, когда я прокручиваю календарь, чтобы перейти в другой месяц, он автоматически запускал lisntener.

Любой, кто знает альтернативного перечислителя CalendarView, или кто-нибудь знает обходное решение? Пожалуйста, поделитесь

Solutions Collecting From Web of "Android: CalendarView OnDateChangeLIstener"

При прокрутке календаря метод onSelectedDayChange ведет себя так же, как вы нажимаете на другую дату, но не меняете настройки текущей даты . Таким образом, HFDO5 был прав, вам просто нужно сохранить текущую дату при создании своего календаря: Long date = calendar.getDate();

И проверьте его в onSelectedDayChange .

 if(callendar.getDate() != date){ date = calendar.getDate(); //new current date //date is changed on real click...do things.. } 

У меня была такая же проблема, и я нашел для нее обход.

Создайте переменную «Long date», и когда вы запустите окно календаря, сохраните текущую дату в этой переменной.

 Long date; cv = (CalendarView)findViewById(R.id.calendarView1); date = cv.getDate(); 

Теперь в слушателе просто проверьте, совпадает ли новая дата с календарем:

 cv.setOnDateChangeListener(new OnDateChangeListener(){ public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) { if(cv.getDate() != date){ date = cv.getDate(); Toast.makeText(view.getContext(), "Year=" + year + " Month=" + month + " Day=" + dayOfMonth, Toast.LENGTH_LONG).show(); } } }); 

Это сработало для меня 🙂

Наконец, я решил, что мне нужно отобразить кнопку «ОК» под CalendarView экраном, чтобы можно было выбрать дату и расписание календаря.

Потому что, когда вы нажимаете текущую дату, ничего не происходит, и когда вы прокручиваете, вы получаете вызовы в свой OnDateChangeListener .

Пример макета календаря с фоном черной маски, который вы можете щелкнуть, чтобы отклонить:

 <LinearLayout android:id="@+id/calendar_layout" android:onClick="dismissCalendar" android:visibility="gone" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="20dp" android:background="@color/black_mask"> <CalendarView android:id="@+id/calendar" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@color/white" android:showWeekNumber="false" android:firstDayOfWeek="2" /> <TextView android:onClick="selectDate" android:text="@string/select_date" android:background="@color/colorPrimary" style="@style/settings_button"/> </LinearLayout> 

Затем пример кода:

 private void openCalendar(Date date) { calendar.setDate(date.getTime()); calendarLayout.setVisibility(View.VISIBLE); } public void selectDate(View view) { Date date = new Date(calendar.getDate()); // do whatever you need with date dismissCalendar(view); } public void dismissCalendar(View view) { calendarLayout.setVisibility(View.INVISIBLE); } 

Мой путь вокруг этого был использование календаря из HoloEverywhere (доступный исходный код для настройки), комментируя код, вызывающий его, и вызывающий его в методе onDateTapped, который делает ожидаемую вещь. И он работает и на устройствах ICS.

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