16

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

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

4

5 回答 5

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..

}
于 2013-10-25T09:57:13.577 回答
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();
            }               
        }
    });

它对我有用:)

于 2012-11-20T12:49:03.613 回答
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);
}
于 2015-11-10T17:06:53.460 回答
0

我解决这个问题的方法是使用 HoloEverywhere 中的日历(可用于自定义的源代码),注释掉导致调用它的代码并在 onDateTapped 方法中调用它,这是预期的事情。它也适用于 ICS 之前的设备。

于 2013-01-30T12:49:46.657 回答
-1

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

于 2013-08-19T19:41:46.123 回答