Android Studio实现课程表应用,美观又实用(Kotlin版本)

Posted 振华OPPO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Studio实现课程表应用,美观又实用(Kotlin版本)相关的知识,希望对你有一定的参考价值。

项目目录

一、应用概述

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

二、主要技术

gsonbutterknifeeventbusgreendaobugly
colorpreferencematisseglidestatusbarutilFragment
materialdatetimepickerjsoupcustomactivityoncrashRangeSeekBartaptargetview
BroadcastReceiverContent ProviderParcelableServiceActivity

本应用知识点非常多,囊括了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, "没有找到文件管理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 = 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 Studio实现课程表应用,美观又实用(Kotlin版本)的主要内容,如果未能解决你的问题,请参考以下文章

Android课程---Android Studio安装及使用

Android课程---Android Studio的一些小技巧

Android课程---Android Studio使用小技巧:提取方法代码片段

怎么用android studio修改app包名

Android Studio实现考试管理系统

Android Studio getActionBar() 返回 null?