莊云曉 張錦邦 朱浩文 荀浩堅(jiān) 莊龍威 賴嘉杰 張家豪
摘要:Android系統(tǒng)憑借的良好的用戶體驗(yàn),低廉的成本及高開發(fā)性產(chǎn)生了巨大的應(yīng)用量和廣闊的應(yīng)用面。而日歷行程應(yīng)用作為智能終端的出廠必備控件,更是Android系統(tǒng)中不可或缺的一部分,該系統(tǒng)是一個(gè)基于Android手機(jī)的日程管理系統(tǒng),具有基本的活動(dòng)日程安排功能,在日歷瀏覽中可突出顯示安排的日期。為了加強(qiáng)提醒效果,該系統(tǒng)設(shè)計(jì)了只有完成指定小游戲后才能關(guān)閉提醒功能。
關(guān)鍵詞:課程表;日程表;鬧鐘提醒
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)14-0103-03
Abstract:Android system with a good user experience, low cost and high development has generated a huge amount of applications and a wide range of applications. The calendar itinerary application is an essential control of the intelligent terminal, and it is an integral part of the Android system. This system is a schedule management system based on the Android mobile phone and has a basic event scheduling function, which can be highlighted in the calendar browsing. Shows the scheduled date. In order to strengthen the reminder effect, this system is designed to close the reminder function only after completing the designated mini-game.
Key words:curriculum; schedule; alarm reminder
1 背景
隨著移動(dòng)互聯(lián)網(wǎng)的高速發(fā)展,人們已經(jīng)無(wú)法離開移動(dòng)終端,智能手機(jī)也已經(jīng)越來(lái)越普及,對(duì)人們的生活產(chǎn)生了巨大的影響,人們可以隨時(shí)隨地使用手機(jī),隨時(shí)隨地來(lái)查看信息,隨時(shí)隨地用來(lái)上網(wǎng)等,當(dāng)然也急需青春地了解到自己每天所需要完成的事情,或是需要記錄一些容易忘記的重要事件,并能有一個(gè)功能完善的軟件來(lái)幫助人們完成這些事情。在這樣的大背景下,基于安卓平臺(tái)的日歷行程系統(tǒng)軟件也逐漸進(jìn)入安卓開發(fā)者的視野中[1]。
2 多功能日程表應(yīng)用設(shè)計(jì)
2.1 多功能日程表總體設(shè)計(jì)
設(shè)計(jì)并實(shí)現(xiàn)一款基于Android平臺(tái)的日歷行程系統(tǒng),具備基本的日期顯示功能;能夠設(shè)置課程安排等;并提供發(fā)布日記功能,鬧鐘提醒等功能。如圖1。
2.2 多功能日程表功能介紹
該應(yīng)用中主頁(yè)面導(dǎo)航欄包含日記、課程表、代辦事項(xiàng)、日歷等四部分,菜單欄目區(qū)域有設(shè)置,邀請(qǐng)好友、鬧鐘、登陸退出功能等。如圖2。
用戶點(diǎn)擊軟件圖標(biāo),打開軟件,注冊(cè)登錄后:
1)可以看見當(dāng)前日記
2)用戶可以單擊手機(jī)上的菜單按鈕,選擇不同的功能,包括設(shè)置,邀請(qǐng)好友,鬧鐘,退出等功能。
4) 用戶可以點(diǎn)擊下方導(dǎo)航欄按鈕進(jìn)行選擇功能,包括日記,課程表,代辦,日歷等。
4)用戶可以在日記選擇按鈕中發(fā)布刪除日記,在課程表中添加設(shè)置課程安排,在代辦中查看設(shè)置自己的行程和鬧鐘,在日歷中查看當(dāng)前日期。
5)用戶添加了代辦事項(xiàng),啟動(dòng)的提醒服務(wù)后,只有完成指定小游戲才能將其關(guān)閉。
3 多功能日程表應(yīng)用實(shí)現(xiàn)
該系統(tǒng)采用java編寫,Android studio開發(fā)。使用MVC模式架構(gòu),數(shù)據(jù)庫(kù)為SQLite[2]
使用了Material Design、Fragment+ViewPager+RadioButton、CardView、CalendarView等框架或部分自定義view開發(fā)。
3.1 使用Fragment+ViewPager + RadioButton 來(lái)構(gòu)造導(dǎo)航欄
ViewePager是一個(gè)頁(yè)面切換組件,我們可以在里面添加多個(gè)View??梢酝ㄟ^觸摸屏幕左右滑動(dòng)的方式來(lái)切換不同的View,當(dāng)然也可以通過RadioButton的狀態(tài)標(biāo)記來(lái)跳轉(zhuǎn)至不同的View。另外,ViewePager是有著自己特定的Adapter--FragmentPagerAdapter,我們只需重寫FragmentPagerAdapter里的方法就能進(jìn)行使用了[3]。
3.2 鬧鐘提醒功能的創(chuàng)建
我們需要調(diào)用AlarmManager.set()來(lái)把鬧鐘時(shí)間記錄到系統(tǒng)里,這樣,當(dāng)?shù)竭_(dá)設(shè)定的鬧鐘時(shí)間時(shí),系統(tǒng)會(huì)給程序發(fā)送一段廣播,所以,我們還需要通過復(fù)寫onReceive()創(chuàng)建一個(gè)廣播接收器。最后,別忘了在Manifest把剛寫好的廣播接收器給注冊(cè)了[4]。
3.3 使用Calendarview構(gòu)建日歷
日歷視圖(Calendarview)可用于顯示和選擇日期,用戶既可選擇一個(gè)日期,也可通過觸摸來(lái)滾動(dòng)日歷。如果希望該控件的日期改變,可調(diào)用CalendarView的setOnDateChangeListener()方法來(lái)為此組件的點(diǎn)擊事件添加監(jiān)聽器[5]
public class CalendarFragments extends Fragment implements OnMonthChangedListener,OnDateSelectedListener{
private View layout;
private LayoutInflater mInflater;
private MaterialCalendarView mCalendarView;
private static final DateFormat FORMATTER = SimpleDateFormat.getDateInstance();
private TextView mTv2;
private Alarm alarm;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
initUI(inflater, container);
return layout;}
private void initUI(LayoutInflater inflater, ViewGroup container) {
if(layout==null){
mInflater=inflater;
layout = inflater.inflate(R.layout.fragments_calendar, container, false);
findview();
initData(); } }
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
Calendar instance2 = Calendar.getInstance();
CalendarDay date = CalendarDay.from(instance2.get(Calendar.YEAR), instance2.get(Calendar.MONTH),instance2.get(Calendar.DAY_OF_MONTH));
mCalendarView.setSelectedDate(date);
alarm = getNext();
if(null!=alarm){
Calendar c = Calendar.getInstance();
if(c.get(Calendar.YEAR)==alarm.getAlarmTime().get(Calendar.YEAR)&&
c.get(Calendar.MONTH)==alarm.getAlarmTime().get(Calendar.MONTH)&&
c.get(Calendar.DAY_OF_MONTH)==alarm.getAlarmTime().get(Calendar.DAY_OF_MONTH)){
mTv2.setText(alarm.getAlarmName());
}else{mTv2.setText("今天活動(dòng)已超時(shí)或者無(wú)任何活動(dòng)"); }
}else{mTv2.setText("今天活動(dòng)已超時(shí)或者無(wú)任何活動(dòng)"); } }
private void initData() {
mCalendarView.setSelectionColor(getActivity().getResources().getColor(R.color.main_background));
Calendar instance2 = Calendar.getInstance();
CalendarDay date = CalendarDay.from(instance2.get(Calendar.YEAR), instance2.get(Calendar.MONTH),instance2.get(Calendar.DAY_OF_MONTH));
mCalendarView.setSelectedDate(date);
mCalendarView.state().edit().setCalendarDisplayMode(CalendarMode.MONTHS).commit();
mCalendarView.setTopbarVisible(true);
mCalendarView.setOnDateChangedListener(this);
mCalendarView.setOnMonthChangedListener(this);
alarm = getNext();
if(null!=alarm){
Calendar c = Calendar.getInstance();
if(c.get(Calendar.YEAR)==alarm.getAlarmTime().get(Calendar.YEAR)&&
c.get(Calendar.MONTH)==alarm.getAlarmTime().get(Calendar.MONTH)&&
c.get(Calendar.DAY_OF_MONTH)==alarm.getAlarmTime().get(Calendar.DAY_OF_MONTH)){
mTv2.setText(alarm.getAlarmName());
}else{mTv2.setText("今天活動(dòng)已超時(shí)或者無(wú)任何活動(dòng)"); }
}else{mTv2.setText("今天活動(dòng)已超時(shí)或者無(wú)任何活動(dòng)"); } }
private void findview() {
mCalendarView = (MaterialCalendarView) layout.findViewById(R.id.calendarView);
mTv2 = (TextView) layout.findViewById(R.id.textView2);
}
3.4 繪制一個(gè)課程表
先使用多個(gè)LinearLayout布局嵌套來(lái)會(huì)出課程表表格,再通過使用Fragment來(lái)動(dòng)態(tài)加對(duì)應(yīng)的內(nèi)容并設(shè)置對(duì)應(yīng)的點(diǎn)擊事件即可
//初始化課程表
private void initWeekCourseView() {
for (int i = 0; i < mWeekViews.size(); i++) {
initWeekPanel(mWeekViews.get(i), getCourseData()[i]); } }
//添加課程表
private void addWeekCourseView() {
for (int i = 0; i < mWeekViews.size(); i++) {
initWeekPanel(mWeekViews.get(i), getSingleData()[i]); } }
//頂部周一到周日的布局
private void initWeekNameView() {
for (int i = 0; i < mWeekViews.size() + 1; i++) {
TextView tvWeekName = new TextView(getActivity());
LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ll.gravity = Gravity.CENTER | Gravity.CENTER_HORIZONTAL;
if (i != 0) {
ll.weight = 1;
tvWeekName.setText("周" + intToZH(i));
if (i == getWeekDay()) {
tvWeekName.setTextColor(Color.parseColor("#FF0000"));
} else {
tvWeekName.setTextColor(Color.parseColor("#4A4A4A")); }
} else {
ll.weight = 0.8f;
tvWeekName.setText(getMonth() + "月"); }
tvWeekName.setGravity(Gravity.CENTER_HORIZONTAL);
tvWeekName.setLayoutParams(lp);
weekNames.addView(tvWeekName); } }
// 左邊節(jié)次布局,設(shè)定每天最多12節(jié)課
private void initSectionView() {
for (int i = 1; i <= maxSection; i++) {
TextView tvSection = new TextView(getActivity());
LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, getResources().getDimensionPixelSize(R.dimen.sectionHeight));
ll.gravity = Gravity.CENTER;
tvSection.setGravity(Gravity.CENTER);
tvSection.setText(String.valueOf(i));
tvSection.setLayoutParams(lp);
sections.addView(tvSection); } }
//當(dāng)前星期
public int getWeekDay() {
int w = Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1;
if (w <= 0) {w = 7;} return w;}
//當(dāng)前月份
public int getMonth() {
int w = Calendar.getInstance().get(Calendar.MONTH) + 1;
return w; }
// 每次刷新前清除每個(gè)LinearLayout上的課程view
private void clearChildView() {
for (int i = 0; i < mWeekViews.size(); i++) {
if (mWeekViews.get(i) != null)
if (mWeekViews.get(i).getChildCount() > 0)
mWeekViews.get(i).removeAllViews(); } }
4 結(jié)束語(yǔ)
該次開發(fā)的日歷行程系統(tǒng)可以在安卓平臺(tái)上平穩(wěn)運(yùn)行,實(shí)現(xiàn)了原來(lái)計(jì)劃的多有功能,可以查詢?nèi)掌谝约捌渌δ?。而且還有日期管理功能。對(duì)于行程鬧鐘的管理,系統(tǒng)也有相應(yīng)的應(yīng)對(duì)功能;對(duì)于日期的管理,可以設(shè)置相應(yīng)的跳轉(zhuǎn)功能,也可以指定日期提醒,設(shè)備備忘錄等。該系統(tǒng)人機(jī)界面良好,操控性能好。
參考文獻(xiàn):
[1] 郭霖. 第一行代碼Android[M].2版. 北京: 人民郵電出版社, 2014.
[2] 馬獲蕾, 湯海鳳. Android系統(tǒng)中SQLite數(shù)據(jù)庫(kù)的研究[J]. 電腦知識(shí)與技術(shù), 2013(28): 6243-6245.
[3] 雷學(xué)鋒. Android中ViewPager+Fragment+GridView的混合應(yīng)用[J]. 科技廣場(chǎng), 2017(5): 64-67.
[4] 潘志宏, 羅偉斌, 駱金維, 等. 基于Android的智能生日提醒軟件的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦開發(fā)與應(yīng)用, 2013, 26(7): 50-53.
[5] 李寧. 實(shí)現(xiàn)基于Android的日歷系統(tǒng)[J]. 電腦編程技巧與維護(hù), 2011(5): 24-32.