上周花了不少時間,總算把月曆的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中修改,但是可惜都成功不了。先放着吧,回頭再看看有沒有别的解決辦法。