本文章主要展示课表的实现,里面包含很多控件的用法,比如吐司Toast、通知Notification、ListView,数值选择器NumberPicker,SeekBar同editText的关联。抽屉导航栏
还有一些其他的功能,比如InputFilter自定义的字符过滤器,SharedPreferences保存数据,自定义对话框,日期计算等
- 实验数据及结果分析:
- 主要思路:
(一)、需求分析:
因为课表保存在图库之中,每次打开查找十分麻烦,并且课程有上课周之分,需仔细辨别。不同用户课程不同,可能会出现突然加课,需要能够修改课程,不同地区,学校的上课时间也可能有细微不同,用户需要自定义每日上课节数。为了更好的体验,还可能需要自定义文字大小等参数。或者打开app直接告诉我今天上什么课程。
(二)、功能分析:
根据需求,我们需要通过用户录入的课程,结合开学时间和今日时间显示本周课程,同时支持切换周查看下周课程,录入课程时需要可选择上课周数,支持添加和修改上课时间,支持一周上多节课或者不上课。为了方便识别,需要让课表上相同的课程显示相同的颜色。其他细节上的优化以使用体验再做修改。
2.实现结果:
以下是课表的一些演示(华为P50E实机):
以下是课表中用到的各种技术:
1.抽屉导航栏:
采用androidx.drawerlayout.widget.DrawerLayout,在activity_main.xml中,DrawerLayout中第一部分使用了include导入main_content.xml文件中的内容,方便导航栏与主体内容分开编写。在主页面java文件中,使用drawer_layout.openDrawer(GravityCompat.START);
可以打开抽屉导航栏。
2.JAVA动态添加控件:
课程显示和左边时间轴的显示都是动态添加到网格布局中的,使用了GridLayout.LayoutParams类型与course_gridLayout.addView()函数相结合具体操作可以看代码。其他的一些,比如设置中时间轴的数目也同理。
3.日期,数字选择和颜色选择等对话框:
程序使用了大量对话框与用户做交互,比如选择课程颜色时,除了预设的几种颜色以外,还可以点击左边的调色盘来RGB选色,这里的对话框用到了拖动条和输入文本框的回调,数字选择器也很常见。其中利用了SeekBar和EditText的回调函数。
4.SharedPreferences储存数据:
由于课表数据量不大,所以这里用到了SharedPreferences来存储数据,并且为了存储复杂的课程数据,写了Course_Data类进行字符串转换变量。从而使得每个课程只需设置一个键即可存储。
5.ListView的使用:
课表中在两处使用到了ListView,分别是创建课程的课程时间部分和抽屉导航栏中的所有课程,并写了两个适配器:Adapter_Course_Data和Adapter_Course,Adapter_Data简单,Adapter_Course_Data东西多,比较复杂。
其中,因为ListView的复用逻辑,会出现渲染和逻辑上的问题,比如我在第0项,往下滑动,露出第1项一点,再划上去,点逻辑上应该是第0项的按钮,但实际会执行第1项的按钮。为了避免这些问题,我使用了listView.smoothScrollToPosition(position);来让用户滑动时,窗口有一定的顶端吸附能力,在第1项点不到第0项的按钮,从而解决了这个问题。
6.通知:
仅有一个今日课程的简易通知,在MainActivity.java中,使用了Send_Schedule_Notification()函数进行通知的发送,并通过复用通知来更新之前的通知,从而实现了显示今日课程与上课时间的功能
7.正则表达式:
在设置中,当用户输入时间时,用到了String regex = "^([01]?[0-9]|2[0-3]):[0-5]?[0-9]$";来做正则匹配,使得用户的输入限制在0~23:0~59这样的24小时制格式。
8.字符过滤器:
有两个字符过滤器,第一个Custom_Input_Filter.java用于添加课程时限制输入“;& | ”这三个字符,因为上面的字符串转换时用这几个作为分隔符,第二个Custom_Input_Filter_number.java用于在设置中,用户输入时间时限制(数字)与上面正则表达式配合。
9.亮、暗(深、浅)主题手动切换:
打开抽屉导航栏,上面有张AI绘制的图片,点击即可切换亮暗主题。主要就是用getDelegate().setLocalNightMode()函数进行主题颜色的切换,同时设定了亮暗两个styles.xml文件,在布局中使用相同的style名,不同主题下就会调用不同文件中的style,从而实现主题切换。