鸿蒙系列--弹窗
2024-01-09 11:32:15
    		一、概况
ArtUI为我们提供丰富的弹窗样式
分为确认类警告弹框,使用类弹窗
确认类:
- AlertDialog
选择类:
- TextPickerDialog
- DatePickerDialog
- TimePickerDialog
二、警告弹窗:
AlertDialog由三部分组成:
- 标题区,可选的
- 内容区,显示提示消息
- 操作按钮区:用户做确认取消等操作
      AlertDialog.show({
              // 标题
              title: "弹窗标题",
              // 内容
              message: "弹框显示的内容",
              // 点击遮障层时,是否关闭弹窗
              autoCancel: false,
              // 设置弹窗显示位置,使弹窗显示在屏幕底部
              alignment: DialogAlignment.Bottom,
              // 弹窗相对alignment所在位置的偏移量
              offset: { dx: 0, dy: -20 },
              primaryButton: { value: '取消', action: () => {
              }
              },
              secondaryButton: { value: '确认', action: () => {
              }
              },
              // 点击遮障层关闭dialog时的回调
              cancel: () => {
              }
            })
三、选择类弹窗
文本选择弹窗
TextPickerDialog:根据指定的选择范围创建文本选择器,展示在弹窗上
  private datas: string[] = ['java', '鸿蒙', 'Android', 'C++', 'Python']
  @State select: number = 2
        TextPickerDialog.show({
              // 设置文本选择器的选择范围
              range: this.datas,
              // 设置初始选中项的索引值
              selected: this.select,
              // 点击弹窗中的“确定”按钮时触发该回调
              onAccept: (value: TextPickerResult) => {
                // 设置select为按下确定按钮时候的选中项index,这样当弹窗再次弹出时显示选中的是上一次确定的选项
                this.select = value.index;
              },
              // 点击弹窗中的“确定”按钮时触发该回调
              onCancel: () => {
              },
              // 滑动弹窗中的选择器使当前选中项改变时触发该回调
              onChange: (value: TextPickerResult) => {
              }
            })日期选择弹窗
  selectedDate: Date = new Date('2010-1-1');
              DatePickerDialog.show({
                // 设置选择器的起始日期
                start: new Date('2000-1-1'),
                // 设置选择器的结束日期
                end: new Date(),
                // 设置当前选中的日期
                selected: new Date('2024-1-8'),
                //是否显示未农历,默认false
                lunar: false,
                // 点击弹窗中的“确定”按钮时触发该回调
                onAccept: (value: DatePickerResult) => {
                  let year = value.year
                  let month = value.month
                  let day = value.day
                  // 通过Date的setFullYear方法设置按下确定按钮时的日期,这样当弹窗再次弹出时显示选中的是上一次确定的日期
                  this.selectedDate.setFullYear(value.year, value.month, value.day)
                },
                // 点击弹窗中的“取消”按钮时触发该回调
                onCancel: () => {
                },
                // 滑动弹窗中的滑动选择器使当前选中项改变时触发该回调
                onChange: (value: DatePickerResult) => {
                  JSON.stringify(value)
                }
              })
四、自定义弹窗
- 自定义弹窗的使用更加灵活,适用于更多的业务场景,可以自定义弹窗内容,构建更加丰富的弹窗界面
- 自定义弹窗的界面可以通过装饰器@CustomDialog定义的组件来实现,然后结合CustomDialogController来控制自定义弹窗的显示和隐藏
步骤:
- 初始化弹窗数据
- 构建弹窗内容
- 使用自定义弹窗
1.创建数据源
在resources/base/element目录下创建资源文件stringarray.json,根节点是strarray
{
  "strarray": [
    {
      "name": "hobbies_data",
      "value": [
        {
          "value": "篮球"
        },
        {
          "value": "足球"
        },
        {
          "value": "羽毛球"
        },
        {
          "value": "棒球"
        },
        {
          "value": "乒乓球"
        }
      ]
    }
  ]
}2.创建实体类
HobbyBean,用来封装自定义弹窗中的数据
export default class HobbyBean{
  label: string;
  //列表数据是否被选中
  isChecked: boolean;
}3.封装自定义弹窗
创建一个ArkTS文件CustomDialogWidget,用来封装自定义弹窗,使用装饰器@CustomDialog修饰CustomDialogWidget表示这是一个自定义弹窗。使用资源管理对象manager获取数据,并将数据封装到hobbyBeans
@CustomDialog
export default struct CustomDialogWidget {
  @State hobbyBeans: HobbyBean[] = [];
  aboutToAppear() {
    let context: Context = getContext(this);
    let manager = context.resourceManager;
    manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {
      ...
      hobbyResult.forEach((hobbyItem: string) => {
        let hobbyBean = new HobbyBean();
        hobbyBean.label = hobbyItem;
        hobbyBean.isChecked = false;
        this.hobbyBeans.push(hobbyBean);
      });
    });
  }
  build() {...}
}
4.创建弹窗组件
controller对象用于控制弹窗的控制和隐藏,hobbies表示弹窗选中的数据结果。setHobbiesValue方法用于筛选出被选中的数据,赋值给hobbies。
@CustomDialog
export default struct CustomDialogWidget {
  @State hobbyBeans: HobbyBean[] = [];
  @Link hobbies: string;
  private controller?: CustomDialogController;
  aboutToAppear() {...}
  setHobbiesValue(hobbyBeans: HobbyBean[]) {
    let hobbiesText: string = '';
    hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>
    isCheckItem?.isChecked)
      .map((checkedItem: HobbyBean) => {
        return checkedItem.label;
      }).join(',');
    this.hobbies = hobbiesText;
  }
  build() {
    Column() {
      Text($r('app.string.text_title_hobbies'))...
      List() {
        ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {
          ListItem() {
            Row() {
              Text(itemHobby.label)...
              Toggle({ type: ToggleType.Checkbox, isOn: false })...
                .onChange((isCheck) => {
                  itemHobby.isChecked = isCheck;
                })
            }
          }
        }, itemHobby => itemHobby.label)
      }
      Row() {
        Button($r('app.string.cancel_button'))...
          .onClick(() => {
            this.controller?.close();
          })
        Button($r('app.string.definite_button'))...
          .onClick(() => {
            this.setHobbiesValue(this.hobbyBeans);
            this.controller?.close();
          })
      }
    }
  }
}5.使用自定义弹窗
在自定义弹窗的使用页面HomePage中先定义一个变量hobbies,使用装饰器@State修饰,和自定义弹窗中的@Link 装饰器修饰的变量进行双向绑定,然后在需要弹框的地方,调用customDialogController的open方法,用于显示弹窗
  @State hobbies: string = ''
  customDialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogWidget({
      hobbies: $hobbies,
    }),
    alignment: DialogAlignment.Bottom,
    customStyle: true,
    offset: { dx: 0, dy: -20 }
  });
this.customDialogController.open();CustomDialogWidget完整代码:
import HobbyBean from './HobbyBean';
@CustomDialog
export default struct CustomDialogWidget {
  //数据源
  @State hobbyBeans: HobbyBean[] = [];
  //弹窗选中的数据结果
  @Link hobbies: String
  //控制器,用于控制弹框的显示和隐藏
  private controller: CustomDialogController
  build() {
    Column() {
      Text("兴趣爱好")
      List() {
        ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {
          ListItem() {
            Row() {
              Text(itemHobby.label)
              Toggle({ type: ToggleType.Checkbox, isOn: false })
                .onChange((isCheck) => {
                  itemHobby.isChecked = isCheck
                })
            }.width('100%')
          }
        })
      }
      Row({ space: 20 }) {
        Button('取消')
          .onClick(() => {
            this.controller.close()
          })
        Button('确定')
          .onClick(() => {
            this.setHobbiesValue(this.hobbyBeans)
            this.controller.close()
          })
      }
    }.width('100%')
    .backgroundColor(Color.White)
  }
  setHobbiesValue(hobbyBeans: HobbyBean[]) {
    let hobbiesText: string = '';
    hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>
    isCheckItem?.isChecked)
      .map((checkedItem: HobbyBean) => {
        return checkedItem.label;
      }).join(',');
    this.hobbies = hobbiesText;
  }
  //完成数据的初始化
  aboutToAppear() {
    let context: Context = getContext(this);
    let manager = context.resourceManager;
    //使用资源管理器对象manager获取资源在资源文件中定义的兴趣爱好数据
    manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {
      //遍历数据,将数据封装到HobbyBean 对象中
      hobbyResult.forEach((hobbyItem: string) => {
        let hobbyBean = new HobbyBean();
        hobbyBean.label = hobbyItem;
        //默认选中设置成false
        hobbyBean.isChecked = false;
        this.hobbyBeans.push(hobbyBean);
      });
    });
  }
}
    			文章来源:https://blog.csdn.net/weixin_42277946/article/details/135452385
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
