上周花了不少时间,总算把日历的demo程序(http://blog.csdn.net/h7870181/article/details/8960478)弄清楚了。
关于画边框和数字以及背景的几个函数就不想写列出来,都是很简单的几个函数。重点写一下处理日期计算的函数。calulatedate()。
这个函数的目的是计算当前页面中42个日期的具体排列。42个日期很容易得出,看下自己电脑以及手机上的日历,都是6行7列的一个排列。因为有时候一个月的第一天会出现在周日,而31天的话,5行是不够使的,所以是6行7列。这就需要几件事情需要处理:
1. 判断当月的第一天在日历中的位置;
2. 填充上个月的最后几天;
3. 填充下个月的前几天。
这个思路清楚了以后,再看程序就不难理解了。
正如我自己写的注释一样,逐行解释下代码的意思吧:
settime(curdate),将日历设置成当前月份,这样才能在下一行set(calendar.day_of_month, 1)函数中将index设置到当月的第一天,
然后再利用get(calendar.day_of_week)函数就可以返回这个月的第一天是当月中的星期几了。注意周日返回1,周六是7。
接下来因为很多日历有自己的模式,比如有的把周日当做一周的第一天,有的把周一当做第一天。所以monthstart -=1(or 2)来把当前的模式设置成自己想要的格式。
举个例子更容易理解。4月1号是周二,monthstart得到的结果是3,因为我是把周日设为每周的第一天,所以,减1后monthstart是2,所以date[2] =1。 也就是当月矩阵的第3天是1号。(数组从0开始)。
好了,第一天找到了,接下来就开始把上个月的最后几天填进去了。那如何确定上个月有几天呢?
一样的方法。
set(calendar.day_of_month, 0),经过debug查看dayinmonth的值,我感觉把set函数的第二个参数设置成0的意思是将index回滚到上个月的最后一天,然后再调用get函数当然得到的结果就是上个月的天数了。
接下来的for循环就不用多说了吧。
然后填充当月的数字:
这里为了得到本月总共有多少天,需要先add(calendar.month,1),将index设置到下个月,然后再set(calendar.day_of_month,0)回滚到上个月(也就是当月)的最后一天,然后再get一下,就得到了这个月的天数(30?31?29?28?),然后知道了这个月有多少天,有知道了第一天的位置,很容易填充了,for循环就搞定了。
然后同样的方法,来把下个月的若干天也填充到数组中去。
核心的算法就是这个函数。
今天再次尝试了下全屏的方法,之前在网上看有两种方法:
方法1:
使用xml的方法,在该项目的androidmanifest.xml文件中,在需要全屏的activity元素中添加属性
android:theme="@android:style/theme.notitlebar.fullscreen"
这样就可以实现这个activity的全屏显示,如果只是不要标题栏,即需要保留系统自带的任务栏的话,则使用
android:theme="@android:style/theme.notitlebar"
这样的好处是可以不用在代码中进行修改
方法2:
即使用代码进行修改
在activity 的oncreat函数中加入下面的代码:
[java] view
plaincopy
requestwindowfeature(window.feature_no_title);
getwindow().setflags(windowmanager.layoutparams. flag_fullscreen ,windowmanager.layoutparams. flag_fullscreen);
使用代码可以动态使该activity进行全屏,如可实现屏幕双击后进行全屏等
实际开发过程中,我使用修改xml的方法一直不行,每次在虚拟机上都运行不起来,然后尝试了一下在代码中修改,成功了,但是代码一定要在 setcontentview(r.layout.activity_main_page)之前,否则还是会报错。
另外用代码的方法还有个不好的地方是刚开始的时候,上端的标题栏会闪一块黑色,然后过1秒才会变成全屏的。所以一直想尝试在xml中修改,但是可惜都成功不了。先放着吧,回头再看看有没有别的解决办法。