我已经实现了这个监听器,以便在单击某个日期时显示某些内容,但问题是当我向下滚动CalendarView时,它会自动显示一些内容但我没有点击任何内容,我只是在CalendarView中向下滚动到另一个月,然后有一个,比如说Toast或Log,无论哪个(我猜它是有意义的,因为监听器本身会触发`onDateChange,因为向下滚动日历也会改变当前选择的日期)。所以我的问题是,是否有任何CalendarView的监听器,我可能只使用ondateChange监听器的替代方案,以避免当我向下滚动calendarView转到另一个月时它会自动解雇lisntener的情况。
任何知道CalendarView的替代列表器或任何人都知道解决方法的人?请分享
答案 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消息。否则,它会显示带有路线的谷歌地图。