赞
踩
在本篇文章中,我们将使用List组件、Toggle组件以及Router接口,实现一个简单的设置页,点击将跳转到对应的详细设置页面。效果图如下:
完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:
获取OpenHarmony系统版本:标准系统解决方案(二进制)。以3.2 Release版本为例:
搭建烧录环境。
本篇Codelab只对核心代码进行讲解,完整代码可以直接从gitee获取。
- ├──entry/src/main/ets // 代码区
- │ ├──common
- │ │ ├──constants
- │ │ │ └──CommonConstant.ets // 常量集合文件
- │ │ └──utils
- │ │ ├──BroadCast.ets // 事件发布订阅管理器
- │ │ └──Log.ets // 日志打印
- │ ├──entryability
- │ │ └──EntryAbility.ts // 应用入口,承载应用的生命周期
- │ ├──model
- │ │ ├──EventSourceManager.ets // 事件资源管理器
- │ │ ├──TaskInfo.ets // 任务信息存放
- │ │ └──TaskInitList.ets // 初始化数据
- │ ├──pages
- │ │ ├──ListIndexPage.ets // 页面入口
- │ │ └──TaskEditPage.ets // 编辑任务页
- │ ├──view
- │ │ ├──CustomDialogView.ets // 自定义弹窗统一入口
- │ │ ├──TaskDetail.ets // 任务编辑详情组件
- │ │ ├──TaskEditListItem.ets // 任务编辑详情Item组件
- │ │ ├──TaskList.ets // 任务列表组件
- │ │ └──TaskSettingDialog.ets // 弹窗组件
- │ └──viewmodel
- │ ├──FrequencySetting.ets // 频率范围设置
- │ └──TaskTargetSetting.ets // 任务目标设置
- └──entry/src/main/resources
- ├──base
- │ ├──element // 字符串以及颜色的资源文件
- │ ├──media // 图片等资源文件
- │ └──profile // 页面配置文件存放位置
- ├──en_US
- │ └──element
- │ └──string.json // 英文字符存放位置
- ├──rawfile // 大体积媒体资源存放位置
- └──zh_CN
- └──element
- └──string.json // 中文字符存放位置
任务列表页由上部分的标题、返回按钮以及正中间的任务列表组成。实现效果如图:
使用Navigation以及List组件构成元素,使用ForEach遍历生成具体列表。这里是Navigation构成页面导航:
- // ListIndexPage.ets
- Navigation() {
- Column() {
-
- // 页面中间的列表
- TaskList()
- }
- .width(THOUSANDTH_1000)
- .justifyContent(FlexAlign.Center)
- }
- .size({ width:THOUSANDTH_1000, height:THOUSANDTH_1000 })
- .title(ADD_TASK_TITLE)
列表右侧有一个判断是否开启的文字标识,点击某个列表需要跳转到对应的任务编辑页里。具体的列表实现如下:
- // TaskList.ets
- List({ space:commonConst.LIST_ITEM_SPACE }) {
- ForEach(this.taskList, (item: TaskListItem) => {
- ListItem() {
- Row() {
- Row() {
- Image(item?.icon)
- ...
- Text(item?.taskName)
- ...
- }
- .width(commonConst.THOUSANDTH_500)
-
- // 状态显示
- if (item?.isOpen) {
- Text($r('app.string.already_open'))
- ...
- }
- Image($r('app.media.right_grey'))
- ...
- }
- ...
- }
- ...
- // 路由跳转到任务编辑页
- .onClick(() => {
- router.pushUrl({
- url: 'pages/TaskEditPage',
- params: {
- params: formatParams(item),
- }
- })
- })
- ...
- })
- }
任务编辑页由上方的“编辑任务”标题以及返回按钮,主体内容的List配置项和下方的完成按钮组成,实现效果如图:
由于每一个配置项功能不相同,且逻辑复杂,故将其拆分为五个独立的组件。
任务编辑页面,由Navigation和一个自定义组件TaskDetail构成:
- // TaskEditPage.ets
- Navigation() {
- Column() {
- TaskDetail()
- }
- .width(THOUSANDTH_1000)
- .height(THOUSANDTH_1000)
- }
- .size({ width:THOUSANDTH_1000, height:THOUSANDTH_1000 })
- .title(EDIT_TASK_TITLE)
- .titleMode(NavigationTitleMode.Mini)
自定义组件由List以及其子组件ListItem构成:
- // TaskDetail.ets
- List({ space:commonConst.LIST_ITEM_SPACE }) {
- ListItem() {
- TaskChooseItem()
- }
- ...
- ListItem() {
- TargetSetItem()
- }
- ...
- ListItem() {
- OpenRemindItem()
- }
- ...
- ListItem() {
- RemindTimeItem()
- }
- ...
- ListItem() {
- FrequencyItem()
- }
- ...
- }
- .width(commonConst.THOUSANDTH_940)
列表的每一项做了禁用判断,需要任务打开才可以点击编辑:
- // TaskDetail.ets
- .enabled(this.settingParams?.isOpen)
一些特殊情况的禁用,如每日微笑、每日刷牙的目标设置不可编辑:
- // TaskDetail.ets
- .enabled(
- this.settingParams?.isOpen
- && (this.settingParams?.taskID !== taskType.smile)
- && (this.settingParams?.taskID !== taskType.brushTeeth)
- )
提醒时间在开启提醒打开之后才可以编辑:
- // TaskDetail.ets
- .enabled(this.settingParams?.isOpen && this.settingParams?.isAlarm)
设置完成之后,点击完成按钮,此处为了模拟效果,并不与数据库产生交互,因此直接弹出提示“设置完成!!!”。
- // TaskDetail.ets
- finishTaskEdit() {
- prompt.showToast({
- message: commonConst.SETTING_FINISHED_MESSAGE
- })
- }
弹窗由封装的自定义组件CustomDialogView注册事件,并在点击对应的编辑项时触发,从而打开弹窗:
CustomDialogView引入实例并注册事件:
- // CustomDialogView.ets
- targetSettingDialog = new CustomDialogController({
- builder: TargetSettingDialog(),
- autoCancel: true,
- alignment: DialogAlignment.Bottom,
- offset: { dx:ZERO, dy:MINUS_20 }
- })
- ...
-
- // 注册事件
- this.broadCast.on(
- BroadCastType.SHOW_FREQUENCY_DIALOG,
- () => {
- this.FrequencyDialogController.open();
- })
点击对应的编辑项触发:
- // TaskDetail.ets
- .onClick(() => {
- if (this.broadCast !== undefined) {
- this.broadCast.emit(
- BroadCastType.SHOW_TARGET_SETTING_DIALOG);
- }
- })
自定义弹窗的实现:
因为任务目标设置有三种类型:
如下图所示:
故根据任务的ID进行区分,将同一弹窗复用:
- // TaskSettingDialog.ets
- if ([taskType.getup, taskType.sleepEarly].indexOf(this.settingParams?.taskID) > commonConst.HAS_NO_INDEX) {
- TimePicker({
- selected:commonConst.DEFAULT_SELECTED_TIME
- })
- ...
- } else {
- TextPicker({ range:this.settingParams?.taskID === taskType.drinkWater ? this.drinkRange : this.appleRange,
- value: this.settingParams.targetValue})
- ...
- }
弹窗确认的时候将修改好的值赋予该项设置,如不符合规则,将弹出提示:
- // TaskSettingDialog.ets
- // 校验规则
- compareTime(startTime: string, endTime: string) {
- if (returnTimeStamp(this.currentTime) < returnTimeStamp(startTime) ||
- returnTimeStamp(this.currentTime) > returnTimeStamp(endTime)) {
-
- // 弹出提示
- prompt.showToast({
- message:commonConst.CHOOSE_TIME_OUT_RANGE
- })
- return false;
- }
- return true;
- }
-
- // 设置修改项
- if (this.settingParams?.taskID === taskType.sleepEarly) {
- if (!this.compareTime(commonConst.SLEEP_EARLY_TIME, commonConst.SLEEP_LATE_TIME)) {
- return;
- }
- this.settingParams.targetValue = this.currentTime;
- return;
- }
- this.settingParams.targetValue = this.currentValue;
其余弹窗实现基本类似,这里不再赘述。
有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
HarmonOS基础技能
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
OpenHarmony北向、南向开发环境搭建
获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。