Android: CalendarView OnDateChangeLIstener

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

Кто-нибудь, кто знает альтернативный список для CalendarView или кто-нибудь знает обходной путь? пожалуйста, поделитесь


person lemoncodes    schedule 28.09.2012    source источник


Ответы (5)


Когда вы прокручиваете календарь, метод 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..

}
person Aleksa    schedule 25.10.2013
comment
Я сделал это в своем приложении, но при прокрутке движения календаря это не гладко. можно ли это отнести к решению? - person jack_the_beast; 11.12.2014

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

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

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();
            }               
        }
    });

это сработало для меня :)

person HFDO5    schedule 20.11.2012
comment
это не помогает setOnDateChangeListener, он всегда возвращает первоначально выбранную дату, поэтому тост никогда не будет отображаться. Поправьте меня если я ошибаюсь. - person Jay Mayu; 02.01.2013
comment
вы не ошибаетесь, это обходной путь... тост никогда не будет отображаться для прокрутки, только для выбора другой даты... - person HFDO5; 10.01.2013
comment
@ HFDO5 - Ваша логика работы работает, но как выбрать текущую дату? - person TheDevMan; 27.03.2015
comment
если я реализую это, он говорит мне, что дата должна быть объявлена ​​окончательной: Variable date is accessed from within inner class, needs to be declared final если я это сделаю, она не может установить дату с помощью date=cv.getDate() что я делаю неправильно? - person Jamie-505; 11.06.2016

В конце концов я решил, что мне нужно отобразить кнопку «ОК» под 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);
}
person Ferran Maylinch    schedule 10.11.2015

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

person Lubos Horacek    schedule 30.01.2013

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

person ksu    schedule 19.08.2013