Android:CalendarView OnDateChangeLIstener

时间:2012-09-28 13:46:05

标签: android android-calendar

我已经实现了这个监听器,以便在单击某个日期时显示某些内容,但问题是当我向下滚动CalendarView时,它会自动显示一些内容但我没有点击任何内容,我只是在CalendarView中向下滚动到另一个月,然后有一个,比如说Toast或Log,无论哪个(我猜它是有意义的,因为监听器本身会触发`onDateChange,因为向下滚动日历也会改变当前选择的日期)。所以我的问题是,是否有任何CalendarView的监听器,我可能只使用ondateChange监听器的替代方案,以避免当我向下滚动calendarView转到另一个月时它会自动解雇lisntener的情况。

任何知道CalendarView的替代列表器或任何人都知道解决方法的人?请分享

5 个答案:

答案 0 :(得分:8)

滚动日历时,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..

}

答案 1 :(得分:7)

我遇到了同样的问题并找到了解决办法。

创建“长日期”变量,当您启动日历窗口时,将当前日期保存在此变量中。

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

它对我有用:)

答案 2 :(得分:2)

最后,我决定在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);
}

答案 3 :(得分:0)

我的方法是使用HoloEverywhere中的日历(可用的自定义源代码),注释掉导致调用它的代码并在onDateTapped方法中调用它,这样可以完成预期的操作。 它也适用于前ICS设备。

答案 4 :(得分:-1)

也许我对前一个问题的解决方案会给你一些想法。 当我从日历视图中选择日期时,会显示一个谷歌地图,显示我在该日期行走的路线。因为从数据库中检索纬度和经度,所以我在数据库中查询该日期,如果没有记录,则应用程序会弹出一个Toast消息。否则,它会显示带有路线的谷歌地图。