Android Studio实现课程表应用Kotlin版本

一、应用概述

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

二、主要技术

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 = null
    tllocation.error = null
    tlteacher.error = null
    if ("" == 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_TASK
        share.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, 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 = section
   classSchedule.name = name
   classSchedule.location = location
   if (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 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...