项目目录

  • 一、应用概述
  • 二、主要技术
  • 三、开发环境
  • 四、主要功能
    • 1、设置课程表
    • 2、导入导出
    • 3、上下课提醒
  • 五、运行演示
  • 六、源码获取

一、应用概述

本次课程表应用功能非常丰富,而且非常实用,可以添加学期的课程信息,设置展示的课程页面,设置上下课时间,设置课表的字体大小,更换应用背景图片、显示授课老师。将设置好的课程表导出到手机内,也可以将课程表文件导入应用,还可以通过通讯工具分享课程表。有上下课提醒,上课时手机自动静音,提醒服务后台常驻。具有个性化设置,设置应用主题,还可以查看软件详情。可以说,是一款非常完整出色的课程表应用。

二、主要技术

gson butterknife eventbus greendao bugly
colorpreference matisse glide statusbarutil Fragment
materialdatetimepicker jsoup customactivityoncrash RangeSeekBar taptargetview
BroadcastReceiver Content Provider Parcelable Service Activity

本应用知识点非常多,囊括了Android所有基础内容,包含四大组件、网络访问和存储管理等内容。

三、开发环境

开发环境依旧是在3.6.1上进行开发的,只要你的AS是近两年从官网下载的,都是可以满足的。

用Android Studio打开, Build Successful后用模拟器运行。

四、主要功能

1、设置课程表

课程表主要有课程名、上课地点和老师三个属性,我们需要在设置课程时将值插入数据库的表中。然后在Fragment的列表中显示表中信息,输入的代码如下:

private fun isInputError(tvteacher: TextInputEditText, tvlocation: TextInputEditText, tvname: TextInputEditText, tlname: TextInputLayout, tllocation: TextInputLayout, tlteacher: TextInputLayout): Boolean {tlname.error = nulltllocation.error = nulltlteacher.error = nullif ("" == tvname.text.toString()) {tlname.error = "请输入课程名"return true}if ("" == tvlocation.text.toString()) {tllocation.error = "请输入地点"return true}if ("" == tvteacher.text.toString()) {tlteacher.error = "请输入教师"return true}return false
}

2、导入导出

数据实体类DataEntity传入参数为application,表示获取应用的课程表数据,然后toJson转成json格式再toByteArray()转成字节数组。然后创建一个新文件,前面是Dir路径,后面是文件名。调用输出流,将字节数组的内容一行一行地写入文件中。输出完成后,调用getUriForFile()方法获取file的uri地址,创建一个Intent对象,传参为Intent.ACTION_SEND,可以通过QQ、微信、邮箱等应用分享。

private fun shareFile() {val dataEntity = DataEntity(application as App)val gson = Gson()val bytes = gson.toJson(dataEntity).toByteArray()val fileName = cacheDir.toString() + File.separator + "云舒课表课程数据.json"try {FileOutputStream(fileName).use { fileOutputStream ->fileOutputStream.write(bytes, 0, bytes.size)fileOutputStream.flush()}} catch (e: IOException) {Log.e(TAG, " ", e)Toast.makeText(this, "生成数据失败", Toast.LENGTH_SHORT).show()CrashReport.postCatchedException(e)}val uri = FileProvider.getUriForFile(this, "top.itning.yunshuclassschedule.fileProvider", File(fileName))val share = Intent(Intent.ACTION_SEND)share.putExtra(Intent.EXTRA_STREAM, uri)share.type = "application/octet-stream"share.flags = Intent.FLAG_ACTIVITY_NEW_TASKshare.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)startActivity(Intent.createChooser(share, "分享课程数据文件"))}

导出文件基于上面的内容,首先是创建新文件,文件名为str+time,这样确定唯一性。intent对象设置访问存储空间属性,然后跳转,采用try-catch捕获异常,代码比较简单。

    private fun exportFile() {val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)intent.addCategory(Intent.CATEGORY_OPENABLE)val fileName = "云舒课表课程数据" + SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINESE).format(Date()) + ".json"intent.putExtra(Intent.EXTRA_TITLE, fileName)try {startActivityForResult(intent, WRITE_REQUEST_CODE)} catch (e: ActivityNotFoundException) {Toast.makeText(this, "没有找到文件管理APP", Toast.LENGTH_SHORT).show()}}

导入文件会启动文件选择器,打开系统文件夹,还有从intent对象创建上入手,Intent.ACTION_GET_CONTENT是获取本地所有图片,返回的uri格式,Intent.CATEGORY_OPENABLE设置文件是可以打开的。

    private fun importFile() {val intent = Intent(Intent.ACTION_GET_CONTENT)intent.addCategory(Intent.CATEGORY_OPENABLE)try {startActivityForResult(Intent.createChooser(intent, "选择课程数据文件进行导入"), FILE_SELECT_CODE)} catch (e: ActivityNotFoundException) {Toast.makeText(this, "没有找到文件管理APP", Toast.LENGTH_SHORT).show()}}

3、上下课提醒

使用BroadCast Receiver设置广播提醒,当系统日期和课表日期相同,且系统时间到达上下课的时间时,会发送广播给手机,通过铃声提醒。

Log.d(TAG, "get data: type->$type name->$name location->$location section->$section status->$status week->$week")if (PHONE_MUTE == type) {if (status == 0) {Log.d(TAG, "PHONE_MUTE_OPEN")EventBus.getDefault().post(EventEntity(ConstantPool.Int.PHONE_MUTE_OPEN))} else {Log.d(TAG, "PHONE_MUTE_CANCEL")EventBus.getDefault().post(EventEntity(ConstantPool.Int.PHONE_MUTE_CANCEL))}}val classSchedule = ClassSchedule()classSchedule.section = sectionclassSchedule.name = nameclassSchedule.location = locationif (CLASS_REMINDER_UP == type) {Log.d(TAG, "CLASS_UP_REMIND")EventBus.getDefault().post(EventEntity(ConstantPool.Int.CLASS_UP_REMIND, "", classSchedule))}if (CLASS_REMINDER_DOWN == type) {Log.d(TAG, "CLASS_DOWN_REMIND")EventBus.getDefault().post(EventEntity(ConstantPool.Int.CLASS_DOWN_REMIND, "", classSchedule))}

五、运行演示

1、运行应用,用模拟器打开,短暂的欢迎界面后,进入引导界面,只有在初次使用时才会有引导界面,之后就不会再显示引导界面了。引导界面由【导入数据】和【开始使用】两个按钮,选择导入数据是从手机存储导入,但是我们刚开始肯定是没有课程表文件的,所以选择开始使用。

2、进入应用主页后,显示对话框设置每天的课程节数,有下拉数字列表进行选择。

3、我选择8节课,然后跳转到课时设置,可以根据自己情况设置每节课的上下课时间。

点击某一节课,跳出钟表对话框,可以拖动指针设置时和分,内圈是0-12,外圈是13-24,动画效果拉满,点击确定即可设置成功。

4、课时设置没问题后,点击右上角确定按钮。进入首页,可以看到工具栏有今天的日期,还有两个菜单栏项。下面是顶部导航栏,分为今天课表和本周课表,如果没有课程数据,就会默认显示下面的内容。

5、我们滑到右侧,进入本周,长按某一节课的空白位置,弹出对话框。

输入课程名、地点和教师,然后点击确定按钮添加成功,如果有数据还可以点删除按钮删除,或者复制该课程,然后在填写其他时间的课程时直接粘贴。

我们输入课程信息,然后设置课程周数,可以自己勾选,也可以点击按钮【设为单周课程】,或者【设为双周课程】,或者【全部选择】,还可以【清空选择】,还可以选择【区间】,功能很多,自由选择。

这就是我添加了一些课程后的视图,可以看到颜色不同,上面显示课程名和上课教室。

6、点击右上角菜单,弹出功能列表。


设置字体大小,拖动进度条,可以改变字体大小。

更换背景图片,同意权限后,可以从设备上找文件。

显示授课老师,这其实是个开关项,再看菜单项会变成隐藏授课老师。

上一周和下一周查看课表,可以看到下一周的早上,机器学习这门课开课。

7、查看今天课表,可以看到下节课是媒体计算,在三工101,还有2分钟上课。

8、到达上课时间了,这是最后一节课,还有150分钟下课,时间会实时刷新。

如果你是没有课的,那么会显示今天课全部上完了。

9、点击左上角菜单按钮,显示滑动菜单,滑动菜单有课程表、设置和夜间模式。

10、打开夜间模式,我们看下变化,非常适合夜间光亮不足时查看。

11、进入设置页面,有课程设置、上下课提醒和个性化设置等等。

12、默认展示课程页面,还能重新设置课时。


13、导入导出课程表,能选择文件导入,或者导出到文件,还能分享课程数据。



14、设置当前周数,输入然后确定即可调整。

15、上下课提醒,设置开关项。

16、手机自动静音设置,打开后自动在上课时静音。

17、主题颜色调整,主色调、次色调、强调色和进度条颜色。


六、源码获取

关注公众号《萌新加油站》,后台回复:课程表,即可获取完整源代码。


Android Studio实现课程表应用(Kotlin版本)相关推荐

  1. 如何导入别人的android studio项目,解决gradle版本不兼容问题

    如何导入别人的android studio项目,解决gradle版本不兼容问题 参考文章: (1)如何导入别人的android studio项目,解决gradle版本不兼容问题 (2)https:// ...

  2. android studio设置生成的release版本apk的名称

    今天,简单讲讲如何使用android studio设置生成apk的名称. 一.首先讲讲如何使用android studio生成release版本的apk. 1.1.前提 发布release 版本,首先 ...

  3. Android Studio 2.3 Canary 3 版本发布

    开发团队12月13日发文宣布 Android Studio 2.3 Canary 3 版本已发布至 Canary 和 Dev 渠道. 除了常见的大量 bug 修复,在这个版本中还有一些值得注意的变化: ...

  4. Android Studio稍微较新的版本下载

    ALL ANDROID STUDIO PACKAGES-V1.4.1.2422023 Select a specific Android Studio package for your platfor ...

  5. 教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考

    教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考 这是老师给我们布置的任务,我在这里做一个简单的总结,话不多说,直接上图上步骤吧 首先,在菜单栏中,点击 B ...

  6. Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述

    Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述 一.Android Studio(3.6.2版本)安装 java2smali ...

  7. Android Studio(3.6.2版本)不使用插件查看smali代码的方法

    Android Studio(3.6.2版本)不使用插件查看smali代码的方法 1.app->build->outputs->apk->debug->app-debug ...

  8. Android studio中打包生成release版本时提示 A problem occurred evaluating root project ‘My‘出错问题的解决方法

    在Android studio中打包生成release版本时,下面的build output 提示 :   A problem occurred evaluating root project 'My ...

  9. 利用 Android Studio 和 Gradle 打包多版本APK

    视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html ==================================== ...

最新文章

  1. 卸载ORACLE 11g
  2. 学习asp.net ajax 笔记(一)
  3. 图像处理直方图匹配-巴氏系数原理及实现
  4. html5图像调整大小,JavaScript调整HTML5画布中图像的大小
  5. 画函数图形的C#程序(改进版) (转)
  6. qt如何安装python_安装Python QT,PythonQT,的
  7. 天才?骗子?解析Deep Tech
  8. python/数据库操作补充—模板—Session
  9. MySQL error(2006) server has gone away
  10. centos 修改时区及NTP时间同步
  11. [互联网思维(转)]互联网思维法则
  12. arduino 有源 蜂鸣器_(二十)arduino入门:蜂鸣器的使用
  13. 让AngularJS兼容IE8及其以下浏览器版本的方法
  14. iOS悬浮、可拖动、自动吸附屏幕边缘的按钮制作
  15. SRE岗位理解(上篇)—读SRE实战手册有感
  16. java赛马游戏_Java程序之赛马游戏
  17. Vue3快速学习、vue3视频学习、vue3实例上手教程
  18. 量子物理史话 第四章 白云深处
  19. 木瓜奇迹洗服务器维护,木瓜奇迹各种职业+点法
  20. css 交集选择器 并集选择器 后代选择器

热门文章

  1. APP运营推广策略的基本要点
  2. java实现火车票查询_各位朋友,有人知道怎么用Java语言设计一个火车票购票系统吗?...
  3. linux编译lame,技术|Linux 有问必答:如何在Linux中修复“fatal error: lame/lame.h: No such file or dir...
  4. 2014年最新显卡天梯图
  5. 论文查重费用如何降低?
  6. 分享16个经典的免费UI素材网站
  7. 想转行学测试,我劝你先了解一下这些内容
  8. Bootstrap5使用bootstrapValidator完成表单验证(包括解决样式、图标不显示及其他组件表单验证出问题解决方案)
  9. 从TdEngine20行代码引发的风波,看10倍程序员与普通程序员的差距
  10. Auto.js实例UI