《android日历日程设计文档.doc》由会员分享,可在线阅读,更多相关《android日历日程设计文档.doc(43页珍藏版)》请在三一办公上搜索。
1、校内生产实习报告Android日历日程管理指导老师: xxx 姓 名: xxx 专业班级: xxxxxxxxxxxxx 学 号: xxxxxxxx 电 话: xxxxxxxxx 系 (院): 计算机与信息工程学院 2014年 7月 14日目录一.项目概述.41.1编写目的41.2项目介绍41.3软件相关信息4二 项目需求.42.1概述42.1.1编写目的42.1.2项目概述52.1.3运行环境52.2项目需求分析52.2.1项目需求介绍52.2.2 自定义与其他类库52.2.3 模块、流程描述52.3功能需求62.3.1功能需求点列表62.3.2其他功能需求72.3.3 系统界面72.4 系统
2、输入输出需求7三软件概要设计.83.1 概述83.1.1 编写目的83.1.2 预期读者83.2系统概要设计说明83.2.1系统功能模块说明83.2.2系统功能模块结构图8四软件详细设计.114.1.系统的日历界面114.1.1系统主界面114.1.2 系统的日历特色显示134.2 系统日程界面的设计144.2.1日程界面的数据库准备144.2.2 数据库操作154.3 添加日程界面174.3.1画图类174.3.2 日程添加184.4日程界面244.4.1日程界面的布局244.2.3 单一日程界面264.2.4 标记日程日期284.5系统菜单项294.5.1日历界面的菜单项294.5.2其他
3、界面菜单项实现314.6天气查询界面设计324.7 系统主要实现类介绍344.7.1 CalendarActivity类344.7.2 CalendarConvert类354.7.3 CalendarView类354.7.4 ScheduleAll类364.7.5 ScheduleInfoView类374.7.6 ScheduleTypeView类374.7.7 LunarCalendar类384.7.8 SpecialCalendar类394.7.9 WeatherActivity类40五.总结.425.1参考资料425.2总结语42一.项目概述1.1编写目的 本文档的编写主要为了介绍本项目
4、的开发目的,项目需求,以及开发的情况,将本系统的结构进行大概的介绍,以便用户更熟悉的了解本软件,让用户在使用该软件前,对本软件的使用有一定的了解。1.2项目介绍随着智能手机的逐渐普及及其功能的多样化、实用化,移动设备逐渐成为人们生活中不可或缺的一部分。目前,市场占有率最高的两个移动平台系统分别为苹果公司的ios,及Google作为代表的Android系统,移动端也逐渐成为各行业商家的争夺之地,程序开发人员也将战场向移动端扩散。本项目为Android移动端的日历日程管理软件,用于显示日历及记录日程,本软件可以浏览公历日期,也可以显示农历日期及公历和农历假期信息,用户可以单击某一天进行日程事件的添
5、加,并浏览日程事件,用户可以跳转到指定日期查看该日期的相关信息并查询当天的天气信息。本项目的开发是为方便Android移动端用户在处理日常事物时提供日历日程的服务。1.3软件相关信息软件名称:生活日历软件版本:1.0适用平台:Android4.0及以上二 项目需求2.1概述2.1.1编写目的本文档的编写主要是描述本软件需要实现的功能,列出本软件的需求点,作为开发人员开发目标系统及编程所需的基础,也作为项目完成验收时作为产品是否符合要求的一个参考。本文档的预期读者为开发人员,用户。2.1.2项目概述本项目的目标受众为所有Android用户,Android系统现在已经成为相当主流的移动端系统,本系
6、统作为Android端的应用软件,有很广泛的受众群。本软件主要为用户提供日常生活的日历浏览,日程管理,天气查询等相关服务。待开发软件名称:生活日历2.1.3运行环境Android 4.0及以上2.2项目需求分析2.2.1项目需求介绍(1)日历浏览:显示日历信息,包括公历,农历,假日信息。日程添加: 在点击某一日期时跳转至日程添加界面,进行日程信息的添加。(2)日程删除:在长按某一日程信息时出现是否删除的对话框。日程浏览:点击菜单日程进入日程浏览界面。(3)日期跳转:选择要查看的日期进行跳转。(4)天气查询:输入某一中国城市进行当天天气的查询。2.2.2 自定义与其他类库 1.ksoap2 An
7、droid用于调用WebService的第三方类库。 2.NETutils 自定义的获取手机网络状态的类2.2.3 模块、流程描述(1)主界面:用于显示日期信息,信息包括农历日期,公历日期,节日信息,日程标记日期,头部textview包括年月信息及闰月,天干地支。 (2)日期跳转:用于用户在输入想要查看的日期后跳转到指定的日期。(3)日期转换:用户在输入某一个日期后,输出改日期的农历日期。(4)显示日程:用户点击此菜单选项后,系统跳入日程显示界面,显示用户添加的所有日程。(5)天气查询:用户点击此菜单按钮后悔弹出一个输入框,提示用户输入城市,查询指定城市的天气信息。(6)主界面Item:点击某
8、一日期后,弹出日程编辑界面,用户可以编辑自己的日程并进行保存。据此得出本软件运行的大概流程,如图2-1日期跳转主界面(日历显示界面)进入系统日期转换天气查询(点击日期进入)添加日程信息显示日程图2-1 软件运行流程2.3功能需求2.3.1功能需求点列表功能名称功能描述输入预期输出日历显示用于显示日期信息,包括公立及农历你年月日,星期,节假日信息,头部应包含当前年月、生肖及天支地干。点击软件图标进入软件显示功能描述的所有日期信息日程添加添加日程,用户选择日程类型,提醒重复方式,设置时间信息。编辑完成后可以保存。点击主界面的Item(即某一日期)进入日程编辑界面日程跳转用户输入某一日期,点击按钮后
9、跳转到指定日期在指定方位内的某一日期跳转至指定日期日程浏览浏览所有日程信息列表,可以浏览日程的相关信息点击菜单的日程按钮显示所有日程日程删除长按某一日程信息弹出对话框,用户可以选择是否删除日程。长按想要删除的日程指定日程被删除,或者放弃删除后转至日程界面。天气查询用户输入城市后,通过webservice查询指定城市的信息并显示点击菜单的天气查询按钮,输入中国的某一城市显示指定城市的天气信息2.3.2其他功能需求 A在日历显示界面,用户在屏幕进行左右滑动时,显示的日历的月份相应的进入下一个月或者上一个月的日历。 B在日程显示的界面,添加了添加日程菜单,用于在当日按添加日程。 C在日历显示界面,今
10、天的日期应该特殊显示。 D在添加日程时用户应该可以自己选择想要的提醒类型。2.3.3 系统界面 系统的界面及介绍:A主界面:默认为日历显示界面。B日程添加界面:在点击某一日期后出现,进行日程的添加。C日程显示界面:在点击主界面的日程按钮进入。D天气查询:点击主界面菜单的天气查询进入。2.4 系统输入输出需求 在本软件中,当在要求输入的时候应该进行输入检查,当输入的信息为空时 应该提醒用户输入信息;在输入时间信息时,若超出指定范围应弹出相应的 提示信息;在输入城市进行天气查询时,若无指定城市则提示无此城市的提示信息。三软件概要设计3.1 概述3.1.1 编写目的 本部分文档的编写是让读者尽快的了
11、解本软件的概要设计,对软件的运行流 程有一个大概的了解。3.1.2 预期读者 本部分文档的预期读者是详细开发人员,开发人员,测试人员。3.2系统概要设计说明3.2.1系统功能模块说明(1)日历查看模块:拥有一个完整的日历界面,包括头部的年月日、生肖、 闰年的显示,还有每个日期上都分别有阳历和阴历的日期显示,并且日历中包含了各个重要的节日或纪念日等。在日历界面上每个日期都会跳到当前日期的日程添加界面或者是日程显示界面。日历界面上还有对存在日程的标记,有利于人们更好的管理日程。(2)日程管理模块:在本模块中包括总的日程显示页面和日历页面所跳转到的日程显示界面或者是日程添加界面。总日程显示界面每一个
12、日程都会有它所包含的日期、时间、日程类型、重复类型和日程内容。日历日期所对应的日程显示界面也是相应的显示。而在日程添加界面中包含了显示界面所对应的各项数据、添加日程成功后会有对应日历日期的标记。另外也有对日程的一系列管理操作的功能。 (3)天气查询模块:在本模块中包括对指定城市天气的查询和显示。3.2.2系统功能模块结构图 (1)在程序设计分析的基础上,结合实际情况,得出本程序的功能模块结构图。在结构图中包括了功能模块的表示及其中部分功能的实现原理。首先是一个总的功能模块的结构图,其中包括了系统设计时的总体功能概括,如图3-1:模块描述:a.日程模块:主要是添加日程,显示日程概况,点击日程显示
13、日程详细信息。b.主界面:主界面即为日历显示界面,用于显示日历及有日程信息的日程的标记。c.天气模块:用于查询指定城市的天气信息。d.总日程显示:即显示所有添加的日程列表。e.单一日程显示:显示某一日程的详细信息。日历日程系统天气查询天气模块日历显示单一日程显示 总日程显示日程模块主界面 图3-1 系统模块结构图(2)在日历模块分为以下几部分,如图3-2:日历显示日期显示节假日显示农历显示 图3-2 日历模块的组成 (3)在日程管理中的添加日程包括以下几部分,如图3-3:日程类型选择添加日程界面日程内容书写日程时间选择重复类型选择 图3-3 添加日程界面的组成(4)系统的主要类调用a.程序启动
14、先到androidManifest.xml读取数据,启动CalendarActivity。接着加载main.xml初始化layout,接着加CalendarView,该类引用了CalendarView类,而CalendarView类聚合了BorderText、BorderEditText和BorderTextView(这3个类都是负责界面的绘制)。因此每次重绘都会调用这三个类。 b.在主界面按menu按钮可以选择进入自己相应的界面。选择“今 天”则启动CalendarActivity回到日历显示界面,;选择“跳转”时则调用系统的DatePickerDialog类弹出日期选择界面;选择“日程”时
15、则启动ScheduleAll类显示所有日程信息,点击某一日程时则启动ScheduleInfoView类显示详细的日程信息;选择“日期转换”时则启动CalendarConvert类来进行日期的跳转;选择“天气查询”时则启动WeatherActivity类来进入天气查询界面。四软件详细设计4.1.系统的日历界面4.1.1系统主界面 系统主界面用到的类包括CalendarActivity,CalendarView(1)首先是建立一个布局文件,上面一部分是显示年月日、生肖和农历的干支纪年。使用的是一个TextView类,对应的在日历的CalendarActivity文件中加入函数来添加头部的年份等信息
16、。首先需要写了一个CalendarView类,这是为日历显示所写的一个类,在其中使用重载的方法定义了几个不同参数的CalendarView,用于不同的情况。在CalendarActivity中实例化CalendarView并且使用CalendarView中的一个方法CalendarView(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);然后书写方法来添加头部的年份 闰哪月等信息。(2)首先是对这个页面的头部进行布局,通过动态化的方法来完成。然后建立一个可以进行改变值的StringBuffer类型的参数textDate。
17、对这个参数进行append操作,添加例如年月日的知道参数里。其中有一个闰年判断的条件函数,是通过calV.getLeapMonth()的值惊醒判断的。完成后对界面使用setText方法来赋值到界面上。最后是对界面的一些美化,同样使用动态布局模式进行。(3)日历界面中主体日期部分显示的完成在CalendarActivity文件初始化实例对象时加入动态添加布局文件的方法。我将此方法命名为addGridView。在这个方法中同样是先进行动态化布局,由于这里用的是GridView,这个GridView应用于将一系列的空间组织成二维网格的形式显示出来,所以适用于在这里进行的日期界面的建立。同样的首先是动
18、态化布局的建立,这可以实例化GridView为gridView参数进行的。在这里需要添加GridView控件的列为7,列宽为46。并且还加上判断屏幕大小的条件,这需要加入取得屏幕大小的对应函数,这里如果是800*480屏幕的话,就将列宽设置为69。然后进行设置水平和竖直的间距、取值边框、设置居中等操作。在这个方法里面还需加入个OnTouch方法,用来将gridView中的触摸事件回传给gestureDetector,进行下面的触摸操作,即: /将gridview中的触摸事件回传给gestureDetectorpublic boolean onTouch(View v, MotionEvent
19、event) return CalendarActivity.this.gestureDetector.onTouchEvent(event););创建完日历的布局后,是在里面添加上具体的日期。就当前显示的页面来说,是建立几个对应的参数,用来显示或传接数据。例如在函数开始时就String dayNumber = new String49; 这是作为对GridView控件内进行标记序列的,用于下面条件语句的判断等,还有就是界面内的一些控件名的实例化。 然后是动态化的对页面进行属性值的设置。其中在对日期中的第一行,即周一等值的这行,设置字的颜色及背景图。得出这行的位置就需要通过对参数positio
20、n(对应编号)进行判断是否在7以内。 下一步是当前月信息的显示,这也需要条件函数来判断是否为当前月,也是来判断参数position是否在范围内。在这个月中还需对当天来一个特殊化,即设置当天日期的背景为图片current_day_bgc,字色为白。 在这些操作外,还需要得到一些数值来用于日期数据的插入,在这里建立了个getCalendar方法,如判断是否为闰年的函数返回值isLeapyear,某月的总天数,某月的第一天是星期几,上个月总天数。在这方法中再执行方法getweek,用来得出以后需要标记的日期,这个在后面来介绍。通过上述的步骤基本完成了日历界面中的初步建设。(3)由于日历菜单需要能通过
21、手势触摸来进行翻页,所以要在总体布局下建立一个ViewFlipper类,这个类是用来实现屏幕的切换效果的。先是在布局中建立这个类,然后实例化手势gestureDetector并取得布局中ViewFlipper用于下面的调用。然后是书写书写手势的各个方法,最主要的是onFling的方法,在这里实现了页面的向左及向右滑动的操作,这个操作是由条件语句来实现的,由滑动两点的x坐标的值进行差值计算,如果是起点减去重点大于120时着向左滑动,反之则向右滑动。在滑动操作开始,并且已切换一面后就需要载入新的一张日历页面,这里又会用到参数calV,当向左滑动时则将参数calV所代表的函数CalendarView
22、里的jumpMonth加1,代表下一个月;当向右滑动时则将参数calV所代表的函数CalendarView里的jumpMonth减1,代表上一个月。为了完整性剩余的手势函数只是写了方法未使用。4.1.2 系统的日历特色显示在日历的显示中除了一些基本的日期显示,在日期页面头部有每年相应的生肖和闰年显示,在日期上有每日的阴历以及节假日的显示。这里有两个类,分别是LunarCalendar 和SpecialCalendar。在LunarCalendar里面包括干支纪年,阴历,生肖,节假日等信息。例如生肖则是建立一个字节数组来记录十二生肖,并且用函数来传回参数对应的生肖。final public St
23、ring animalsYear(int year) final String Animals = new String 鼠, 牛, 虎, 兔, 龙, 蛇,马, 羊, 猴, 鸡, 狗, 猪 ;return Animals(year - 4) % 12;在SpecialCalendar是闰年的判断函数,每月天数,以及对每月的第一天星期的判断。闰年通过传回年值通过函数进行判断,并传回布尔值。每月的天数用switch进行判断赋值给月份天数的参数。对每月的第一天为星期几的判断并指定。主要代码如下:/指定某年中的某月的第一天是星期几public int getWeekdayOfMonth(int yea
24、r, int month)Calendar cal = Calendar.getInstance();cal.set(year, month-1, 1);dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;return dayOfWeek;最终的效果图如下图4-1:图4-1 日历界面的最终实现图4.2 系统日程界面的设计日程界面包括日程主界面(所有日程的显示)和对应日期日程的显示,日程的添加等。在日程界面涉及到日程的数据存储,所以先介绍下关于日程的数据存储以及有日程的日期存储(为日历界面的标记服务)。4.2.1日程界面的数据库准备(1)数据库里表的建立分别建
25、立了schedule表(日程的表)和scheduletagdate(标记日期所需的表)Android 提供了标准的数据库创建方式。建立DBOpenHelper类继承到SQLiteOpenHelper ,实现onCreate 和 onUpgrade 两个方法。OnCreate方法是用于初次使用软件时生成数据库,onUpgrade方法是用于升级软件时更新数据库表结构。首先是schedule表的建立,在这个表中包括日程ID、日程类型的ID、日程重复类型的ID、日程正文内容、日程日程时间这几个参数。建立时对应需要写上参数名、参数类型、主键等。 db.execSQL(CREATE TABLE IF NO
26、T EXISTS schedule(scheduleID integer primary key autoincrement, +scheduleTypeID integer,remindID integer,scheduleContent text,scheduleDate text); 下面是scheduletagdate表的建立,在这个表中包括标记的ID、年信息、月信息、日信息、日程ID这几个参数。 db.execSQL(CREATE TABLE IF NOT EXISTS scheduletagdate(tagID integer primary key autoincrement,
27、+year integer,month integer,day integer,scheduleID integer); 建立完表后是继续写入onUpgrade方法,这个方法会在数据库升级时被触发,以便于软件升级时更新表结构。public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) /更新数据db.execSQL(DROP TABLE IF EXISTS schedule);db.execSQL(DROP TABLE IF EXISTS scheduletagdate);onCreate(db);(2)再分
28、别建立ScheduleVO 和ScheduleDateTag ,里面分别写了表里面各个数据的get(表示获取某个变量值)和set(表示设置某个变量值)方法,以便于调用。(3)建立ScheduleDAO文件,这个文件是用来写数据库的查找、删除等方法。 首先是需要实例化DBOpenHelper用于数据库数据的get与set。private DBOpenHelper dbOpenHelper = null;public ScheduleDAO(Context context)dbOpenHelper = new DBOpenHelper(context, schedules.db);4.2.2 数据
29、库操作下面就是对表中数据的操作了,包括了保存日程信息、查询某一条日程信息、查询所有的信息、删除日程、将日程标记的日期保存到数据库中。(1)保存日程信息,先是从日程添加页面里获取日程类型的ID、日程重复类型的ID、日程正文内容、日程日程时间这几个参数,然后是使用ContentValues类(这个类是一个键值对,是用来存储名值对,它的名一般是String类型,而值都是基本类型)来new一个参数,用这个参数的put方法将这些个参数放入到数据库中。values.put(scheduleTypeID, scheduleVO.getScheduleTypeID();values.put(remindID,
30、 scheduleVO.getRemindID();values.put(scheduleContent, scheduleVO.getScheduleContent();values.put(scheduleDate, scheduleVO.getScheduleDate();最后调用添加方法insert。 db.insert(schedule, null, values);/插入信息另外需要moveToFirst方法来判断是否为空,进行相关的操作。(2)查询某一条日程信息,由于我这里的设计是通过对日程的点击来查看当前点击日期的详细信息,即是根据日程的ID来查看的。android sqlit
31、e的查询方法是query方法,它的查询语句是:db.query(schedule, new StringscheduleID,scheduleTypeID,remindID,scheduleContent,scheduleDate, scheduleID=?, new StringString.valueOf(scheduleID), null, null, null);另外还需要的是判断语句,先用cursor.moveToFirst()判断curor是否为空值,不为空则就给cursor赋值,空着直接cursor.close()来关闭。(3)查询所有的日程信息,由于所有日期可能不止一个,所以返
32、回值设为数组形式。查询依旧是用query方法,这里的的where语句相关的就直接设为null值。其他的依旧与查询一条语句相仿。 (4)删除日程,这里的删除日程需要将日程及对应日期上的标记一起删除,这样才可以便于管理,删除使用的语句是delete。db.delete(schedule, scheduleID=?, new StringString.valueOf(scheduleID);/删除日程信息db.delete(scheduletagdate, scheduleID=?, new StringString.valueOf(scheduleID);/删除日程对应的日期标识信息(5)将日程标
33、志日期保存到数据库中,这里是为了将在日期上标识的信息存储到数据库中,方法同第一步的保存相仿,只是数据的不一样,而且使用的是数组形式。for(int i = 0; i dateTagList.size(); i+)/以for循环的方式进行dateTag = dateTagList.get(i);ContentValues values = new ContentValues();values.put(year, dateTag.getYear();/放入年信息values.put(month, dateTag.getMonth();/放入月信息values.put(day, dateTag.ge
34、tDay();/放入日信息values.put(scheduleID, dateTag.getScheduleID();/翻入日程的IDdb.insert(scheduletagdate, null, values);/插入到表scheduletagdate中(6)只查询出当前日程的日期,这个查询语句是通过当前月的年和月信息来得到日程标记上的所有信息。这里也是使用query语句进行查询的,只不过改变了里面的查询使用的参数。所以方法类同于上面所有日程的查询。(7)当点击每一个gridview中item时,查询出此日期上所有的日程标记(scheduleID),通过点击后得到对应日期的年月日信息,然
35、后用query方法得到次日程标记的ID,用于后面得到想到相关的日程信息。query(scheduletagdate, new StringscheduleID, year=? and month=? and day=?, newStringString.valueOf(year),String.valueOf(month),String.valueOf(day), null, null, null);(8)关闭数据库。判断后直接关闭当前数据库。if(dbOpenHelper != null)dbOpenHelper.close();4.3 添加日程界面新增界面是通过对日历界面上单一日期的点击来
36、实现跳转的。4.3.1画图类(1)首先是带下边框的TextView,主要代码如下:Paint paint = new Paint();/ 实例化一支画笔paint.setColor(android.graphics.Color.BLACK); / 设置所绘制的边框颜色为黑色canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1, this.getHeight() - 1, paint); / 绘制下边框(2)带边框的EditText,代码如下:Paint paint = new Paint();/ 实例化一支画笔paint.se
37、tStrokeWidth(1);/设置空心现款paint.setStyle(Style.STROKE);/设置样式paint.setColor(android.graphics.Color.GRAY);/设置颜色paint.setAntiAlias(true);/抗锯齿方法RectF rectF = new RectF(2,0,this.getWidth()-2,this.getHeight()-2);/现在设置相关的参数用于下面的操作。canvas.drawRoundRect(rectF, 8, 8, paint);/画上圆弧(3)最后一个是带边框的TextView这个与上述的EditTex
38、t相类似。完成这些边框类之后就是使用它们,这个与以前的基本类相似,只是将布局中原来的基本类名类,如TextView,改为对应路径的名称为com.manage.borderText.BorderTextView。(BorderTextView是新建的TextView类的文件名。)(4)新增日程界面的布局,文件名为schedule.xml(5)分别为日程类型及重复类型这两个类型的选择的点击框。android:layout_below=id/scheduleTop/文本框的位置设置android:layout_width=160dp/文本框的宽android:layout_height=40dp/文
39、本框的高android:drawableRight=drawable/schedule_type下面还有时间的点击修改框、日程文本框及最后的保存及取消的按钮。最后效果如图4-2:图4-2 日程添加界面效果图4.3.2 日程添加新增界面的上方有两个TextView是用来选择类型的,另有一个时间显示框可以用来显示传过来的时间或者修改时间。选择类型的实现方法以其中一个为例首先是取得这TextView的位置,实例化它,以便于后面的使用,scheduleType = (BorderTextView) findViewById(R.id.scheduleType);点击时跳到选择界面并传值,跳转的时候需要
40、获得原来界面上的日程类型,这里需要在点击触发效果的方法上将数据传到类型选择页面上去,用于显示它的默认值。scheduleType.setOnClickListener(new OnClickListener() /日程类型的点击事件 public void onClick(View v) /点击时方法实现的内容schText = scheduleText.getText().toString();Intent intent = new Intent();intent.setClass(ScheduleAddActivity.this, ScheduleTypeView.class);/实现页面
41、从日程添加页面到日程类型选择页面的跳转intent.putExtra(sch_remind, new intsch_typeID,remindID);/跳转时需要传过去的数据,两个数据组成一个数组传过去startActivity(intent);/运行);这里还包括一个CalendarConstant类,这个类是用于记录日程类型和重复类型的字符数组,以便于类型选择的调用。public class CalendarConstant public final static String sch_type = 会议, 约会, 电话, 纪念日, 生日, 课程, 其他 ; / 日程类型的值public final static String remind = 当天有效,每天重复,每周重复,每月重复,每年重复;/重复类型的值这里是存储ScheduleTypeView和ScheduleRemindView里面选项的value值。这个页面是通过实例化来实现布局的:LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); /设置宽与高