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

news2024/11/28 17:56:35

项目目录

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

一、应用概述

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

二、主要技术

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实现音乐播放器2.0❤️

  • ❤️Android Studio实现新闻App❤️

  • ❤️Android Stduio实现天气预报❤️

  • ❤️Android Studio实现考试管理系统❤️

  • ❤️Android Studio实现记账本项目❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李沐《动手学深度学习》第二版 pytorch笔记1 环境搭建

李沐《动手学深度学习》第二版pytorch笔记1 搭建环境 文章目录李沐《动手学深度学习》第二版pytorch笔记1 搭建环境此时尚有耐心虚拟环境搭建创建虚拟环境查看已有的虚拟环境激活虚拟环境安装深度学习框架和d2l软件包安装d2l安装pytorch连接到虚拟环境测试一下再试试...好难搞下…

[附源码]Python计算机毕业设计Django的剧本杀管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

《Mission Red in Slience》——这本“连环画”值得一看

生命离不开血液。 血液对人的意义是不言而喻的,当失血到总量的30%时,人就会有生命危险。这也就意味着献血有时是看似渺小,实际拯救生命的壮举。同时适度的献血对献血人也有助的。 但很多人对献血缺乏认识,认为其可能具有危险性&…

[附源码]Python计算机毕业设计SSM乐跑(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

3.每天进步一点点-Python爬虫需要了解HTTP 请求报文

14天学习训练营导师课程: 杨鑫《Python 自学编程基础》 杨鑫《 Python 网络爬虫基础》 杨鑫《 Scrapy 爬虫框架实战和项目管理》 文章目录1.HTTP 请求报文1.1 请求行1.2 请求头1.3 空行1.4 请求正文1.HTTP 请求报文 ​ HTTP(Hyper Text Transfer Protoc…

基于51单片机锂电池电压电量检测(原理图+PCB+程序)

资料编号:198 下面是该资料仿真演示视频: 198-基于51单片机锂电池电压电量检测(原理图PCB程序全套资料)功能介绍: 采用51系列自带AD的单片机stc12c5a60s2型号单片机(也是51单片机,外观引脚大小…

20uec++多人游戏【小球与玩家互动】

为小球添加生命值组件和伤害处理函数 //生命值组件UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "Components")class USHealthComponent * HealthComp;//伤害处理函数UFUNCTION()void HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float…

【蓝桥杯十四届第二期模拟赛】第四题——递归求解(python)(耗时仅不到1s出答案)(lru_cache)

前言 这次的第二期蓝桥杯模拟赛为登录官网考试,并没有使用我们那个机房的破电脑,你都让我使用我自己的电脑了,那我不得皮一下【doge】 第四题是填空题,虽然我报名的是c语言赛道,但是还是默默打开了我的pycharm&#…

Bandizip去除广告,注册图标,状态栏文本

Bandizip7.0版本之后,免费版就加入了广告。 安装完成后,Bandizip界面如下,很遗憾,我的没有出现广告,没法展示。 目标:去除界面左上角的注册图标,以及下方底部的状态栏“固实压缩”字样那里&am…

安全多方学习开源框架调研

原创 复旦DSG研究组 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”…

ROS + vscode环境搭建

问题描述 使用ROS vscode进行开发. 解决方案 1. 安装ROS和vscode. 2. 打开vscode, 安装ROS插件. 3. 创建工作空间, 并进行一次catkin_make. mkdir -p catkin_ws/src cd catkin_ws/ catkin_make 4. 用vscode打开工作空间. cd catkin_ws/ code . vscode的ROS插件会自动配…

计算机网络笔记4 网络层

文章目录笔记前言一、网络层概述二、网络层数据交换方式2.1 电路交换2.2 报文交换2.3 分组交换三、网络层协议及报文格式3.10 IP数据报格式3.1 IPv4协议分类编址划分子网无分类编址CIDR3.20 IPv6数据报格式3.2 IPv6协议IPv6地址类型IPv4和IPv6之间的过渡3.3 ARP协议(地址解析协…

Go-Excelize API源码阅读(三十八)——SetCellValue

Go-Excelize API源码阅读(三十八)——SetCellValue 开源摘星计划(WeOpen Star) 是由腾源会 2022 年推出的全新项目,旨在为开源人提供成长激励,为开源项目提供成长支持,助力开发者更好地了解开源…

Java基础:方法

1. 回顾方法的定义和调用 前面的课程中,使用过嵌套循环输出矩形,控制台打印出矩形就可以了,因此将方法定义为 void ,没有返回值。 在主方法 main 中直接被调用。 public class Method { public static void main(String[] args…

Lambda 表达式

1. Lambda 表达式 1.1 通过接口传递代码 针对接口而非具体类型进行编程,可以降低程序的耦合性,提高灵活性,提高复用性。接口常被用于传递代码,比如,我们知道 File 有如下方法: public File[] listFiles(F…

Unity3D中实现Player的第一人称视角

效果,上面为Scene场景,下面为Game场景 0创建地形,当然可以先简单的创建一个空白的Terrain。这里我已经对地形进行了初步的编辑和渲染。 1.在Hierarchy视图中右键创建一个胶囊体(Capsule)作为Player,添加好后重置胶囊体…

039-java集合框架的作用及使用(Collection,Set,Map,SimpleDateFormat)

上一讲:038-JTable控件应用案例讲解_CSDN专家-赖老师(软件之家)的博客-CSDN博客 Java集合体系框架 ava集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口: 集合框架中所有的接口,类都在java.util包中 集合就是动态数组,与数组…

Ubuntu18 vscode配置Ceres的调试

Ceres只支持CMake编译,不支持外部链接方式。因此vscode无法配置Ceres调试! 具体过程如下: 首先写了个CMakeLists.txt,(官方demo),测试编译: project(ceres_test) cmake_minimum_required(VERSION 3.0) f…

uni-app进阶使用(vuex、组件、api)

在上一篇文章介绍了uni-app的基本用法,本章介绍在uni-app中vuex、组件、api的用法。 一、如何使用vuex 1.1 初始化 在项目根目录下创建store文件夹,在其内新建一个文件index.js,在index.js对vuex进行初始化。 import Vuex from vuex impor…

TML+CSS+JS大作业:腾讯课堂首页 1页 侧拉菜单

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&…