符合学术规范的学术服务

Android系统基础上的多功能日程表设计及实现

分类:科技论文 时间:2018-07-16

  Android系统有着良好的用户体验,低廉的成本及高开发性得到了广泛的应用。而日历行程应用作为智能终端的出厂必备控件,更是Android系统中不可或缺的一部分,该系统是一个基于Android手机的日程管理系统,具有基本的活动日程安排功能,在日历浏览中可突出显示安排的日期。为了加强提醒效果,该系统设计了只有完成指定小游戏后才能关闭提醒功能。

  关键词:课程表,日程表,闹钟提醒

系统设计

  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.

  相关范文阅读:单片机在自动控制系统设计中的应用

  在自动控制系统设计中,单片机占据核心地位,由于单片机具备可编程的特点,可以简单、快速的实现自动化控制。下面文章就是以电机设备为研究背景,分析单片机在自动控制系统设计中的应用。

  关键词:单片机,自动控制系统,设计

  

全学科期刊推荐 中英文发表指导

* 稍后学术顾问联系您

学术顾问回访> 详细沟通需求> 确定服务项目> 支付服务金> 完成服务内容

SCI期刊

国际英文期刊

核心期刊

国外书号出书

国内纸质出书

2023最新分区查询