当前位置:   article > 正文

鸿蒙系列--弹窗_鸿蒙 弹出框禁止 返回键关闭alertdialog

鸿蒙 弹出框禁止 返回键关闭alertdialog

一、概况

ArtUI为我们提供丰富的弹窗样式

分为确认类警告弹框,使用类弹窗

确认类:

  • AlertDialog

选择类:

  • TextPickerDialog
  • DatePickerDialog
  • TimePickerDialog

二、警告弹窗:

AlertDialog由三部分组成:

  • 标题区,可选的
  • 内容区,显示提示消息
  • 操作按钮区:用户做确认取消等操作
  1. AlertDialog.show({
  2. // 标题
  3. title: "弹窗标题",
  4. // 内容
  5. message: "弹框显示的内容",
  6. // 点击遮障层时,是否关闭弹窗
  7. autoCancel: false,
  8. // 设置弹窗显示位置,使弹窗显示在屏幕底部
  9. alignment: DialogAlignment.Bottom,
  10. // 弹窗相对alignment所在位置的偏移量
  11. offset: { dx: 0, dy: -20 },
  12. primaryButton: { value: '取消', action: () => {
  13. }
  14. },
  15. secondaryButton: { value: '确认', action: () => {
  16. }
  17. },
  18. // 点击遮障层关闭dialog时的回调
  19. cancel: () => {
  20. }
  21. })

三、选择类弹窗

文本选择弹窗

TextPickerDialog:根据指定的选择范围创建文本选择器,展示在弹窗上

  1. private datas: string[] = ['java', '鸿蒙', 'Android', 'C++', 'Python']
  2. @State select: number = 2
  3. TextPickerDialog.show({
  4. // 设置文本选择器的选择范围
  5. range: this.datas,
  6. // 设置初始选中项的索引值
  7. selected: this.select,
  8. // 点击弹窗中的“确定”按钮时触发该回调
  9. onAccept: (value: TextPickerResult) => {
  10. // 设置select为按下确定按钮时候的选中项index,这样当弹窗再次弹出时显示选中的是上一次确定的选项
  11. this.select = value.index;
  12. },
  13. // 点击弹窗中的“确定”按钮时触发该回调
  14. onCancel: () => {
  15. },
  16. // 滑动弹窗中的选择器使当前选中项改变时触发该回调
  17. onChange: (value: TextPickerResult) => {
  18. }
  19. })

日期选择弹窗

  1. selectedDate: Date = new Date('2010-1-1');
  2. DatePickerDialog.show({
  3. // 设置选择器的起始日期
  4. start: new Date('2000-1-1'),
  5. // 设置选择器的结束日期
  6. end: new Date(),
  7. // 设置当前选中的日期
  8. selected: new Date('2024-1-8'),
  9. //是否显示未农历,默认false
  10. lunar: false,
  11. // 点击弹窗中的“确定”按钮时触发该回调
  12. onAccept: (value: DatePickerResult) => {
  13. let year = value.year
  14. let month = value.month
  15. let day = value.day
  16. // 通过Date的setFullYear方法设置按下确定按钮时的日期,这样当弹窗再次弹出时显示选中的是上一次确定的日期
  17. this.selectedDate.setFullYear(value.year, value.month, value.day)
  18. },
  19. // 点击弹窗中的“取消”按钮时触发该回调
  20. onCancel: () => {
  21. },
  22. // 滑动弹窗中的滑动选择器使当前选中项改变时触发该回调
  23. onChange: (value: DatePickerResult) => {
  24. JSON.stringify(value)
  25. }
  26. })

四、自定义弹窗

  • 自定义弹窗的使用更加灵活,适用于更多的业务场景,可以自定义弹窗内容,构建更加丰富的弹窗界面
  • 自定义弹窗的界面可以通过装饰器@CustomDialog定义的组件来实现,然后结合CustomDialogController来控制自定义弹窗的显示和隐藏

步骤:

  1. 初始化弹窗数据
  2. 构建弹窗内容
  3. 使用自定义弹窗

1.创建数据源

在resources/base/element目录下创建资源文件stringarray.json,根节点是strarray

  1. {
  2. "strarray": [
  3. {
  4. "name": "hobbies_data",
  5. "value": [
  6. {
  7. "value": "篮球"
  8. },
  9. {
  10. "value": "足球"
  11. },
  12. {
  13. "value": "羽毛球"
  14. },
  15. {
  16. "value": "棒球"
  17. },
  18. {
  19. "value": "乒乓球"
  20. }
  21. ]
  22. }
  23. ]
  24. }

2.创建实体类

HobbyBean,用来封装自定义弹窗中的数据

  1. export default class HobbyBean{
  2. label: string;
  3. //列表数据是否被选中
  4. isChecked: boolean;
  5. }

3.封装自定义弹窗

创建一个ArkTS文件CustomDialogWidget,用来封装自定义弹窗,使用装饰器@CustomDialog修饰CustomDialogWidget表示这是一个自定义弹窗。使用资源管理对象manager获取数据,并将数据封装到hobbyBeans

  1. @CustomDialog
  2. export default struct CustomDialogWidget {
  3. @State hobbyBeans: HobbyBean[] = [];
  4. aboutToAppear() {
  5. let context: Context = getContext(this);
  6. let manager = context.resourceManager;
  7. manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {
  8. ...
  9. hobbyResult.forEach((hobbyItem: string) => {
  10. let hobbyBean = new HobbyBean();
  11. hobbyBean.label = hobbyItem;
  12. hobbyBean.isChecked = false;
  13. this.hobbyBeans.push(hobbyBean);
  14. });
  15. });
  16. }
  17. build() {...}
  18. }

4.创建弹窗组件

controller对象用于控制弹窗的控制和隐藏,hobbies表示弹窗选中的数据结果。setHobbiesValue方法用于筛选出被选中的数据,赋值给hobbies。

  1. @CustomDialog
  2. export default struct CustomDialogWidget {
  3. @State hobbyBeans: HobbyBean[] = [];
  4. @Link hobbies: string;
  5. private controller?: CustomDialogController;
  6. aboutToAppear() {...}
  7. setHobbiesValue(hobbyBeans: HobbyBean[]) {
  8. let hobbiesText: string = '';
  9. hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>
  10. isCheckItem?.isChecked)
  11. .map((checkedItem: HobbyBean) => {
  12. return checkedItem.label;
  13. }).join(',');
  14. this.hobbies = hobbiesText;
  15. }
  16. build() {
  17. Column() {
  18. Text($r('app.string.text_title_hobbies'))...
  19. List() {
  20. ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {
  21. ListItem() {
  22. Row() {
  23. Text(itemHobby.label)...
  24. Toggle({ type: ToggleType.Checkbox, isOn: false })...
  25. .onChange((isCheck) => {
  26. itemHobby.isChecked = isCheck;
  27. })
  28. }
  29. }
  30. }, itemHobby => itemHobby.label)
  31. }
  32. Row() {
  33. Button($r('app.string.cancel_button'))...
  34. .onClick(() => {
  35. this.controller?.close();
  36. })
  37. Button($r('app.string.definite_button'))...
  38. .onClick(() => {
  39. this.setHobbiesValue(this.hobbyBeans);
  40. this.controller?.close();
  41. })
  42. }
  43. }
  44. }
  45. }

5.使用自定义弹窗

在自定义弹窗的使用页面HomePage中先定义一个变量hobbies,使用装饰器@State修饰,和自定义弹窗中的@Link 装饰器修饰的变量进行双向绑定,然后在需要弹框的地方,调用customDialogController的open方法,用于显示弹窗

  1. @State hobbies: string = ''
  2. customDialogController: CustomDialogController = new CustomDialogController({
  3. builder: CustomDialogWidget({
  4. hobbies: $hobbies,
  5. }),
  6. alignment: DialogAlignment.Bottom,
  7. customStyle: true,
  8. offset: { dx: 0, dy: -20 }
  9. });
  10. this.customDialogController.open();

CustomDialogWidget完整代码:

  1. import HobbyBean from './HobbyBean';
  2. @CustomDialog
  3. export default struct CustomDialogWidget {
  4. //数据源
  5. @State hobbyBeans: HobbyBean[] = [];
  6. //弹窗选中的数据结果
  7. @Link hobbies: String
  8. //控制器,用于控制弹框的显示和隐藏
  9. private controller: CustomDialogController
  10. build() {
  11. Column() {
  12. Text("兴趣爱好")
  13. List() {
  14. ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {
  15. ListItem() {
  16. Row() {
  17. Text(itemHobby.label)
  18. Toggle({ type: ToggleType.Checkbox, isOn: false })
  19. .onChange((isCheck) => {
  20. itemHobby.isChecked = isCheck
  21. })
  22. }.width('100%')
  23. }
  24. })
  25. }
  26. Row({ space: 20 }) {
  27. Button('取消')
  28. .onClick(() => {
  29. this.controller.close()
  30. })
  31. Button('确定')
  32. .onClick(() => {
  33. this.setHobbiesValue(this.hobbyBeans)
  34. this.controller.close()
  35. })
  36. }
  37. }.width('100%')
  38. .backgroundColor(Color.White)
  39. }
  40. setHobbiesValue(hobbyBeans: HobbyBean[]) {
  41. let hobbiesText: string = '';
  42. hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>
  43. isCheckItem?.isChecked)
  44. .map((checkedItem: HobbyBean) => {
  45. return checkedItem.label;
  46. }).join(',');
  47. this.hobbies = hobbiesText;
  48. }
  49. //完成数据的初始化
  50. aboutToAppear() {
  51. let context: Context = getContext(this);
  52. let manager = context.resourceManager;
  53. //使用资源管理器对象manager获取资源在资源文件中定义的兴趣爱好数据
  54. manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {
  55. //遍历数据,将数据封装到HobbyBean 对象中
  56. hobbyResult.forEach((hobbyItem: string) => {
  57. let hobbyBean = new HobbyBean();
  58. hobbyBean.label = hobbyItem;
  59. //默认选中设置成false
  60. hobbyBean.isChecked = false;
  61. this.hobbyBeans.push(hobbyBean);
  62. });
  63. });
  64. }
  65. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/244537
推荐阅读
相关标签
  

闽ICP备14008679号