• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 自定义弹窗
2
3通过CustomDialogController类显示自定义弹窗。使用弹窗组件时,可优先考虑自定义弹窗,便于自定义弹窗的样式与内容。
4
5> **说明:**
6>
7> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10
11
12## 接口
13
14CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean, alignment?: DialogAlignment, offset?: Offset, customStyle?: boolean, gridCount?: number, maskColor?: ResourceColor, openAnimation?: AnimateParam, closeAniamtion?: AnimateParam})
15
16
17**参数:**
18
19| 参数名                    | 参数类型                                     | 必填   | 参数描述                                     |
20| ---------------------- | ---------------------------------------- | ---- | ---------------------------------------- |
21| builder                | CustomDialog                             | 是    | 自定义弹窗内容构造器。                              |
22| cancel                 | () => void                  | 否    | 点击遮障层退出时的回调。                             |
23| autoCancel             | boolean                                  | 否    | 是否允许点击遮障层退出。<br>默认值:true                 |
24| alignment              | [DialogAlignment](ts-methods-alert-dialog-box.md#dialogalignment枚举说明) | 否    | 弹窗在竖直方向上的对齐方式。<br>默认值:DialogAlignment.Default |
25| offset                 | [Offset](ts-types.md#offset)             | 否    | 弹窗相对alignment所在位置的偏移量。                   |
26| customStyle            | boolean                                  | 否    | 弹窗容器样式是否自定义。<br>默认值:false,弹窗容器的宽度根据栅格系统自适应,不跟随子节点;高度自适应子节点,最大为窗口高度的90%;圆角为24vp。 |
27| gridCount<sup>8+</sup> | number                                   | 否    | 弹窗宽度占[栅格宽度](../../ui/arkts-layout-development-grid-layout.md)的个数。<br>默认值为4,异常值按默认值处理,最大栅格数为系统最大栅格数。 |
28
29## CustomDialogController
30
31### 导入对象
32
33```ts
34dialogController : CustomDialogController = new CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean})
35```
36**说明**:CustomDialogController仅在作为@CustomDialog和@Component struct的成员变量,且在@Component struct内部定义时赋值才有效,具体用法可看下方示例。
37
38### open()
39open(): void
40
41
42显示自定义弹窗内容,若已显示,则不生效。
43
44
45### close
46close(): void
47
48
49关闭显示的自定义弹窗,若已关闭,则不生效。
50
51
52## 示例
53
54```ts
55// xxx.ets
56@CustomDialog
57struct CustomDialogExample {
58  @Link textValue: string
59  @Link inputValue: string
60  controller: CustomDialogController
61  cancel: () => void
62  confirm: () => void
63
64  build() {
65    Column() {
66      Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
67      TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
68        .onChange((value: string) => {
69          this.textValue = value
70        })
71      Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })
72      Flex({ justifyContent: FlexAlign.SpaceAround }) {
73        Button('cancel')
74          .onClick(() => {
75            this.controller.close()
76            this.cancel()
77          }).backgroundColor(0xffffff).fontColor(Color.Black)
78        Button('confirm')
79          .onClick(() => {
80            this.inputValue = this.textValue
81            this.controller.close()
82            this.confirm()
83          }).backgroundColor(0xffffff).fontColor(Color.Red)
84      }.margin({ bottom: 10 })
85    }
86  }
87}
88
89@Entry
90@Component
91struct CustomDialogUser {
92  @State textValue: string = ''
93  @State inputValue: string = 'click me'
94  dialogController: CustomDialogController = new CustomDialogController({
95    builder: CustomDialogExample({
96      cancel: this.onCancel,
97      confirm: this.onAccept,
98      textValue: $textValue,
99      inputValue: $inputValue
100    }),
101    cancel: this.existApp,
102    autoCancel: true,
103    alignment: DialogAlignment.Default,
104    offset: { dx: 0, dy: -20 },
105    gridCount: 4,
106    customStyle: false
107  })
108
109  aboutToDisappear() {
110    delete this.dialogController,
111    this.dialogController = undefined
112  }
113
114  onCancel() {
115    console.info('Callback when the first button is clicked')
116  }
117
118  onAccept() {
119    console.info('Callback when the second button is clicked')
120  }
121
122  existApp() {
123    console.info('Click the callback in the blank area')
124  }
125
126  build() {
127    Column() {
128      Button(this.inputValue)
129        .onClick(() => {
130          if (this.dialogController != undefined) {
131            this.dialogController.open()
132          }
133        }).backgroundColor(0x317aff)
134    }.width('100%').margin({ top: 5 })
135  }
136}
137```
138
139![zh-cn_image_0000001219744203](figures/zh-cn_image_0000001219744203.gif)
140