Android 4.0日历(calendar)源码分析之月视图

1.日期跳转问题:

这个问题是在处理点击today按钮之后,新建日程的日期不是当天,而是当月的1号这个故障时发现的。

对于总是所在月的1号,这个很好处理,因为google原生就是这样设计的。只需在SimpleDayPickerFragment.java文件中将goto()函数的

mFirstDayOfMonth.set(mTempTime);  
mFirstDayOfMonth.monthDay = 1;  
millis = mFirstDayOfMonth.normalize(true);  
         if(isFirst==true){  
             isFirst=false;  
    setMonthDisplayed(mSelectedDay, true);  
         }else{  
             setMonthDisplayed(mFirstDayOfMonth, true);  
         }

大概是在450行左右

改成:

mFirstDayOfMonth.set(mSelectedDay);  
mFirstDayOfMonth.monthDay = mSelectedDay.monthDay;  
millis = mFirstDayOfMonth.normalize(true);  
setMonthDisplayed(mSelectedDay, true);

这样改完之后,不会出现跳转之后总是跳转日期所在月的1号这样的问题了。

但是,会出现有时候跳转后的日期与我们期望的不一致(比如我点击的是today按钮,那么跳转后的日期应该是今天,如果我是在菜单里选着跳转的某一日期,那么跳转后的日期应该是我选择的这个日期)。开始以为是日期的问题,即我给出的跳转日期是错误的,然而在跟踪代码之后发现,只有当跳转过程中出现动画效果的时候才会出现这个情况。

于是我将      goto函数的      

if (animate) {  
                mListView.smoothScrollToPositionFromTop(  
                         position, LIST_TOP_OFFSET, GOTO_SCROLL_DURATION);  
                            onScrollStateChanged(mListView, OnScrollListener.SCROLL_STATE_IDLE);  
               return true;  
            }

这段代码去掉,发现正常了。

看来是在需要动画的情况下所执行的代码导致的。

至于为什么需要动画,好像是根据日期来判断的,判断的语句很奇怪,根本看不出需要动画的理由啊(经过思考,当离所要跳转的日期较远的时候,则没有动画效果,因为这样用户会等很久,而比较近,则慢慢滑动到目标日期,反正比较近,也花不了多长时间)。

在MonthByWeekFragment中

boolean animate = true;  
if (mDaysPerWeek * mNumWeeks * 2 < Math.abs(  
        Time.getJulianDay(event.selectedTime.toMillis(true), event.selectedTime.gmtoff)  
        - Time.getJulianDay(mFirstVisibleDay.toMillis(true), mFirstVisibleDay.gmtoff)  
        - mDaysPerWeek * mNumWeeks / 2)) {  
    animate = false;  
}

而且为什么执行了动画为真条件下的代码之后跳转日期就会出现问题,也还没去研究