基于Android的多功能日程表设计与实现
2018-07-12庄云晓张锦邦朱浩文荀浩坚庄龙威赖嘉杰张家豪
庄云晓 张锦邦 朱浩文 荀浩坚 庄龙威 赖嘉杰 张家豪
摘要:Android系統凭借的良好的用户体验,低廉的成本及高开发性产生了巨大的应用量和广阔的应用面。而日历行程应用作为智能终端的出厂必备控件,更是Android系统中不可或缺的一部分,该系统是一个基于Android手机的日程管理系统,具有基本的活动日程安排功能,在日历浏览中可突出显示安排的日期。为了加强提醒效果,该系统设计了只有完成指定小游戏后才能关闭提醒功能。
关键词:课程表;日程表;闹钟提醒
中图分类号:TP311 文献标识码:A 文章编号: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 背景
随着移动互联网的高速发展,人们已经无法离开移动终端,智能手机也已经越来越普及,对人们的生活产生了巨大的影响,人们可以随时随地使用手机,随时随地来查看信息,随时随地用来上网等,当然也急需青春地了解到自己每天所需要完成的事情,或是需要记录一些容易忘记的重要事件,并能有一个功能完善的软件来帮助人们完成这些事情。在这样的大背景下,基于安卓平台的日历行程系统软件也逐渐进入安卓开发者的视野中[1]。
2 多功能日程表应用设计
2.1 多功能日程表总体设计
设计并实现一款基于Android平台的日历行程系统,具备基本的日期显示功能;能够设置课程安排等;并提供发布日记功能,闹钟提醒等功能。如图1。
2.2 多功能日程表功能介绍
该应用中主页面导航栏包含日记、课程表、代办事项、日历等四部分,菜单栏目区域有设置,邀请好友、闹钟、登陆退出功能等。如图2。
用户点击软件图标,打开软件,注册登录后:
1)可以看见当前日记
2)用户可以单击手机上的菜单按钮,选择不同的功能,包括设置,邀请好友,闹钟,退出等功能。
4) 用户可以点击下方导航栏按钮进行选择功能,包括日记,课程表,代办,日历等。
4)用户可以在日记选择按钮中发布删除日记,在课程表中添加设置课程安排,在代办中查看设置自己的行程和闹钟,在日历中查看当前日期。
5)用户添加了代办事项,启动的提醒服务后,只有完成指定小游戏才能将其关闭。
3 多功能日程表应用实现
该系统采用java编写,Android studio开发。使用MVC模式架构,数据库为SQLite[2]
使用了Material Design、Fragment+ViewPager+RadioButton、CardView、CalendarView等框架或部分自定义view开发。
3.1 使用Fragment+ViewPager + RadioButton 来构造导航栏
ViewePager是一个页面切换组件,我们可以在里面添加多个View。可以通过触摸屏幕左右滑动的方式来切换不同的View,当然也可以通过RadioButton的状态标记来跳转至不同的View。另外,ViewePager是有着自己特定的Adapter--FragmentPagerAdapter,我们只需重写FragmentPagerAdapter里的方法就能进行使用了[3]。
3.2 闹钟提醒功能的创建
我们需要调用AlarmManager.set()来把闹钟时间记录到系统里,这样,当到达设定的闹钟时间时,系统会给程序发送一段广播,所以,我们还需要通过复写onReceive()创建一个广播接收器。最后,别忘了在Manifest把刚写好的广播接收器给注册了[4]。
3.3 使用Calendarview构建日历
日历视图(Calendarview)可用于显示和选择日期,用户既可选择一个日期,也可通过触摸来滚动日历。如果希望该控件的日期改变,可调用CalendarView的setOnDateChangeListener()方法来为此组件的点击事件添加监听器[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("今天活動已超时或者无任何活动"); }
}else{mTv2.setText("今天活动已超时或者无任何活动"); } }
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("今天活动已超时或者无任何活动"); }
}else{mTv2.setText("今天活动已超时或者无任何活动"); } }
private void findview() {
mCalendarView = (MaterialCalendarView) layout.findViewById(R.id.calendarView);
mTv2 = (TextView) layout.findViewById(R.id.textView2);
}
3.4 绘制一个课程表
先使用多个LinearLayout布局嵌套来会出课程表表格,再通过使用Fragment来动态加对应的内容并设置对应的点击事件即可
//初始化课程表
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); } }
// 左边节次布局,设定每天最多12节课
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); } }
//当前星期
public int getWeekDay() {
int w = Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1;
if (w <= 0) {w = 7;} return w;}
//当前月份
public int getMonth() {
int w = Calendar.getInstance().get(Calendar.MONTH) + 1;
return w; }
// 每次刷新前清除每个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 结束语
该次开发的日历行程系统可以在安卓平台上平稳运行,实现了原来计划的多有功能,可以查询日期以及其他功能。而且还有日期管理功能。对于行程闹钟的管理,系统也有相应的应对功能;对于日期的管理,可以设置相应的跳转功能,也可以指定日期提醒,设备备忘录等。该系统人机界面良好,操控性能好。
参考文献:
[1] 郭霖. 第一行代码Android[M].2版. 北京: 人民邮电出版社, 2014.
[2] 马获蕾, 汤海凤. Android系统中SQLite数据库的研究[J]. 电脑知识与技术, 2013(28): 6243-6245.
[3] 雷学锋. Android中ViewPager+Fragment+GridView的混合应用[J]. 科技广场, 2017(5): 64-67.
[4] 潘志宏, 罗伟斌, 骆金维, 等. 基于Android的智能生日提醒软件的设计与实现[J]. 电脑开发与应用, 2013, 26(7): 50-53.
[5] 李宁. 实现基于Android的日历系统[J]. 电脑编程技巧与维护, 2011(5): 24-32.