????????本文章主要展示课表的实现,里面包含很多控件的用法,比如吐司Toast、通知Notification、ListView,数值选择器NumberPicker,SeekBar同editText的关联。抽屉导航栏
????????还有一些其他的功能,比如InputFilter自定义的字符过滤器,SharedPreferences保存数据,自定义对话框,日期计算等
下面是课表的一些演示(华为P50E实机):
?结构如下:
以下是课表中用到的各种技术:
采用androidx.drawerlayout.widget.DrawerLayout,在activity_main.xml中,DrawerLayout中第一部分使用了include导入main_content.xml文件中的内容,方便导航栏与主体内容分开编写。
androidx.drawerlayout.widget.DrawerLayout drawer_layout;
drawer_layout = findViewById(R.id.DrawerLayout);
drawer_layout;drawer_layout.openDrawer(GravityCompat.START);
可以打开抽屉导航栏
课程显示和左边时间轴的显示都是动态添加到网格布局中的,
course_gridLayout.addView(button, layoutParams); course_gridLayout.addView(textView, layoutParams);
具体操作可以看代码。其他的一些,比如设置中时间轴的数目也同理
程序使用了大量对话框与用户做交互,比如选择课程颜色时,除了预设的几种颜色以外,还可以点击左边的调色盘来RGB选色,这里的对话框用到了拖动条和输入文本框的回调,数字选择器也很常见。
由于课表数据量不大,所以这里用到了SharedPreferences来存储数据,并且为了存储复杂的课程数据,写了Course_Data类进行字符串转换变量。
课表中在两处使用到了ListView,分别是创建课程的课程时间部分和抽屉导航栏中的所有课程,并写了两个适配器:Adapter_Course_Data和Adapter_Course,Adapter_Data简单,Adapter_Course_Data东西多,比较复杂。
仅有一个今日课程的简易通知,在MainActivity.java中,?channel,notificationManager,这两个变量的相关函数就是。注意权限
设置中,用户输入时间时,用到了String regex = "^([01]?[0-9]|2[0-3]):[0-5]?[0-9]$";来做正则匹配,就是0~23:0~59这么一个时间。
有两个字符过滤器,第一个Custom_Input_Filter.java用于添加课程时限制输入“;& | ”这三个字符,因为上面的字符串转换时用这几个作为分隔符,第二个Custom_Input_Filter_number.java用于在设置中,用户输入时间时限制(数字)与上面正则表达式配合。
打开抽屉导航栏,上面有张AI绘制的图片,点击即可切换亮暗主题。主要就是用getDelegate().setLocalNightMode();函数
代码较长,不便粘贴,仅需1积分,自行下载。