Android: CalendarView OnDateChangeLIstener - программирование
Подтвердить что ты не робот

Android: CalendarView OnDateChangeLIstener

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

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

4b9b3361

Ответ 1

При прокрутке календаря 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..

}

Ответ 2

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

создайте переменную "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();
            }               
        }
    });

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

Ответ 3

Наконец, я решил, что мне нужно отобразить кнопку "ОК" ниже 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);
}

Ответ 4

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

Ответ 5

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