Android Studio完成课程表应用Kotlin版本
发布时间:2023-03-15 08:55:45 所属栏目:教程 来源:
导读:项目目录
一、应用概述
本次课程表应用功能非常丰富,而且非常实用,可以添加学期的课程信息,设置展示的课程页面,设置上下课时间,设置课表的字体大小,更换应用背景图片、显示授课老师。将设置好的课程表导出
一、应用概述
本次课程表应用功能非常丰富,而且非常实用,可以添加学期的课程信息,设置展示的课程页面,设置上下课时间,设置课表的字体大小,更换应用背景图片、显示授课老师。将设置好的课程表导出
|
项目目录 一、应用概述 本次课程表应用功能非常丰富,而且非常实用,可以添加学期的课程信息,设置展示的课程页面,设置上下课时间,设置课表的字体大小,更换应用背景图片、显示授课老师。将设置好的课程表导出到手机内,也可以将课程表文件导入应用,还可以通过通讯工具分享课程表。有上下课提醒,上课时手机自动静音,提醒服务后台常驻。具有个性化设置,设置应用主题,还可以查看软件详情。可以说,是一款非常完整出色的课程表应用。 二、主要技术 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、运行应用,用模拟器打开,短暂的欢迎界面后,进入引导界面,只有在初次使用时才会有引导界面,之后就不会再显示引导界面了。引导界面由【导入数据】和【开始使用】两个按钮,选择导入数据是从手机存储导入,但是我们刚开始肯定是没有课程表文件的,所以选择开始使用。 (编辑:驾考网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
