Android Studio实现课程表应用(Kotlin版本)
项目目录
- 一、应用概述
- 二、主要技术
- 三、开发环境
- 四、主要功能
- 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版本)相关推荐
- 如何导入别人的android studio项目,解决gradle版本不兼容问题
如何导入别人的android studio项目,解决gradle版本不兼容问题 参考文章: (1)如何导入别人的android studio项目,解决gradle版本不兼容问题 (2)https:// ...
- android studio设置生成的release版本apk的名称
今天,简单讲讲如何使用android studio设置生成apk的名称. 一.首先讲讲如何使用android studio生成release版本的apk. 1.1.前提 发布release 版本,首先 ...
- Android Studio 2.3 Canary 3 版本发布
开发团队12月13日发文宣布 Android Studio 2.3 Canary 3 版本已发布至 Canary 和 Dev 渠道. 除了常见的大量 bug 修复,在这个版本中还有一些值得注意的变化: ...
- Android Studio稍微较新的版本下载
ALL ANDROID STUDIO PACKAGES-V1.4.1.2422023 Select a specific Android Studio package for your platfor ...
- 教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考
教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考 这是老师给我们布置的任务,我在这里做一个简单的总结,话不多说,直接上图上步骤吧 首先,在菜单栏中,点击 B ...
- Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述
Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述 一.Android Studio(3.6.2版本)安装 java2smali ...
- Android Studio(3.6.2版本)不使用插件查看smali代码的方法
Android Studio(3.6.2版本)不使用插件查看smali代码的方法 1.app->build->outputs->apk->debug->app-debug ...
- Android studio中打包生成release版本时提示 A problem occurred evaluating root project ‘My‘出错问题的解决方法
在Android studio中打包生成release版本时,下面的build output 提示 : A problem occurred evaluating root project 'My ...
- 利用 Android Studio 和 Gradle 打包多版本APK
视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html ==================================== ...
最新文章
- 卸载ORACLE 11g
- 学习asp.net ajax 笔记(一)
- 图像处理直方图匹配-巴氏系数原理及实现
- html5图像调整大小,JavaScript调整HTML5画布中图像的大小
- 画函数图形的C#程序(改进版) (转)
- qt如何安装python_安装Python QT,PythonQT,的
- 天才?骗子?解析Deep Tech
- python/数据库操作补充—模板—Session
- MySQL error(2006) server has gone away
- centos 修改时区及NTP时间同步
- [互联网思维(转)]互联网思维法则
- arduino 有源 蜂鸣器_(二十)arduino入门:蜂鸣器的使用
- 让AngularJS兼容IE8及其以下浏览器版本的方法
- iOS悬浮、可拖动、自动吸附屏幕边缘的按钮制作
- SRE岗位理解(上篇)—读SRE实战手册有感
- java赛马游戏_Java程序之赛马游戏
- Vue3快速学习、vue3视频学习、vue3实例上手教程
- 量子物理史话 第四章 白云深处
- 木瓜奇迹洗服务器维护,木瓜奇迹各种职业+点法
- css 交集选择器 并集选择器 后代选择器
热门文章
- APP运营推广策略的基本要点
- java实现火车票查询_各位朋友,有人知道怎么用Java语言设计一个火车票购票系统吗?...
- linux编译lame,技术|Linux 有问必答:如何在Linux中修复“fatal error: lame/lame.h: No such file or dir...
- 2014年最新显卡天梯图
- 论文查重费用如何降低?
- 分享16个经典的免费UI素材网站
- 想转行学测试,我劝你先了解一下这些内容
- Bootstrap5使用bootstrapValidator完成表单验证(包括解决样式、图标不显示及其他组件表单验证出问题解决方案)
- 从TdEngine20行代码引发的风波,看10倍程序员与普通程序员的差距
- Auto.js实例UI