HarmonyOS 鸿蒙Next 使用CustomDialog,如何获取到遮罩层的点击事件

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 使用CustomDialog,如何获取到遮罩层的点击事件 我们有个需求就是 在弹出弹窗的时候

如果用户输入内容 点击遮罩层的时候提示用户

看了下文档没有具体的方式

请问这个需求能实现吗

我这边的方案是自定全屏的弹窗 但是无法解决输入框获取焦点后 软件键盘与输入框之间会有一个空白的区域 这个没办法解决

3 回复

onWillDismiss当用户执行点击遮障层关闭、左滑/右滑、三键back、键盘ESC关闭交互操作时,如果注册该回调函数,则不会立刻关闭弹窗
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-methods-custom-dialog-box-V5#customdialogcontrolleroptions对象说明

打开软键盘会有空白区域,该问题是CustomDialog弹框的规格问题,软键盘拉起后,弹框和软键盘距离16vp导致的
可以监听键盘的出现让弹窗偏移

import { window } from '@kit.ArkUI'

@Preview
@CustomDialog
export struct CommentsEditDialog {
@State comment: string = ''
@State keyHeight: number = 0;
@State scrollHeight: number = 0;
@State dialogIsShow: boolean = true

aboutToAppear(): void {
window.getLastWindow(getContext(this)).then(currentWindow => {
// 设置窗口的布局为沉浸式布局
// currentWindow.setWindowLayoutFullScreen(true);
// 监听软键盘的隐藏和显示
currentWindow.on('avoidAreaChange', data => {
if (data.type == window.AvoidAreaType.TYPE_KEYBOARD) {
if (px2vp(data.area.bottomRect.height) == 0) {
this.keyHeight = 0
} else {
this.keyHeight = 20;
}
return;
}
})
})
}

build() {
this.CommentsEditBuilder()
}

@Builder
CommentsEditBuilder() {

Column {

TextArea({ controller: this.tController, placeholder: '说点什么吧...', text: this.comment })
.fontColor('#313234')
.placeholderColor('#A2A7B1')
.fontSize(14)
.width('100%')
.caretColor(Color.Red)
.padding(10)
.height(88)
.backgroundColor('#F3F3F3')
.borderRadius(5)
.defaultFocus(true)// 页面首次打开时,该TextInput获取焦点
.enableKeyboardOnFocus(true)// .expandSafeArea([SafeAreaType.KEYBOARD])
.id('mTextAreaId')

.onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {

if (isVisible && currentRatio == 1) {
focusControl.requestFocus('mTextAreaId')
}
})
.fontWeight(FontWeight.Regular)
.maxLength(100)
.showCounter(false)
.onChange((value: string) => {
this.comment = value
})

Blank().height(10)
Row {
Blank().width(6)
Text(`${this.comment?.length ?? 0}/100`).fontSize(10).fontColor('#313234').fontWeight(FontWeight.Regular)
Blank()
Text('发送')
.width(53)
.height(21)
.padding(0)
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.backgroundColor((this.comment?.length == 0) ? '#7fE91839' : '#E91839')
.fontSize(11)
.borderRadius(4)
.fontWeight(FontWeight.Medium)
.onClick(() => {

})
Blank().width(6)
}.width('100%')
}
.expandSafeArea([SafeAreaType.SYSTEM])
.backgroundColor(Color.White)
.width('100%')
.height('20%')
.borderRadius(10)
.padding(14)
// .offset({y:20})
.transition(TransitionEffect.OPACITY.animation({ duration: 300, curve: Curve.Ease })
.combine(TransitionEffect.translate({ y: 1000 })))
.offset({ x: 0, y: this.keyHeight }
}

closeDialog() {
this.dialogIsShow = false
if (this.controller != null) {
this.controller.close()
}
}
}

更多关于HarmonyOS 鸿蒙Next 使用CustomDialog,如何获取到遮罩层的点击事件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,若要在使用CustomDialog时获取遮罩层的点击事件,你可以通过以下方式实现:

首先,确保你的CustomDialog布局中包含一个遮罩层(通常是一个覆盖整个对话框背景的透明视图)。在XML布局文件中,为这个遮罩层视图设置一个点击事件监听器。例如,如果你的遮罩层视图ID为mask_view,你可以在JavaScript(或对应的鸿蒙脚本语言,如ETS)中设置点击事件监听:

// 假设你已经获取到了dialog的实例,并且dialog的布局中包含了ID为mask_view的遮罩层
let dialog = this.$refs.myDialog; // 获取dialog实例
let maskView = dialog.$('mask_view'); // 获取遮罩层视图

maskView.onClick(() => {
    // 在这里处理遮罩层的点击事件
    console.log('遮罩层被点击');
    dialog.close(); // 可以选择在这里关闭对话框
});

注意,这里的代码是基于假设的鸿蒙系统下的脚本语言示例,实际鸿蒙开发中可能会使用特定的组件和事件绑定机制。确保你的项目环境和鸿蒙SDK版本支持上述操作。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部