对CalendarView.java的审查表明,突出显示的行被消耗触摸事件的内部私有类覆盖,因此 OnClickListener() 和 OnTouchListener() 都不起作用。
第一个(更难的)选项是制作您自己的 CalendarView.java 副本(称为 MyCustomCalendarView.java)并将其包含到您的项目中。在 MyCustomCalendarView.java 中,添加代码来注册 OnTouchListener,如下所示:
private View.OnTouchListener touchListener;
@Override
public void setOnTouchListener( View.OnTouchListener otl) {
touchListener = otl;
}
然后在私有类 WeeksAdapter 的 OnTouch() 方法中,添加这一行:
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mListView.isEnabled() && mGestureDetector.onTouchEvent(event)) {
touchListener.onTouch(v, event);
...
然后 MyCustomCalendarView 可以按如下方式使用:
MyCustomCalendarView thisCalendar = (MyCustomCalendarView) rootView.findViewById(R.id.mycustom_calendar_view_layout_id);
thisCalendar.setOnTouchListener(myCustomListener);
另一种(更简单)的替代方法是在 calendarView 布局中添加一个按钮,并使用按钮的 onClickListener(可能还有一个标志变量)来检测是否选择了任何日期。在这种情况下,从设备的角度来看,选择当前日期与“未选择日期”相同,因此您可以使用该事实来写入今天的日期或其他自定义操作。
您可以使用datetimepicker-library的日期选择器布局来帮助您入门:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:gravity="center"
android:orientation="vertical"
android:background="@color/date_picker_view_animator"
android:layout_width="@dimen/date_picker_component_width"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="@dimen/selected_calendar_layout_height">
<include layout="@layout/date_picker_selected_date" />
</LinearLayout>
<!-- this is the calendarView, add your own version here as you see fit -->
<include layout="@layout/date_picker_view_animator" />
<!-- this is the button to be added to this layout -->
<View
android:background="@color/line_background"
android:layout_width="@dimen/date_picker_component_width"
android:layout_height="1.0dip" />
<include layout="@layout/date_picker_done_button" />
</LinearLayout>