HarmonyOS 鸿蒙Next:如何在页面B打开时覆盖页面A及其弹框customDialog1

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

HarmonyOS 鸿蒙Next:如何在页面B打开时覆盖页面A及其弹框customDialog1

我在页面A打开了customDialog1 ,弹框1中有跳转新页面的按钮,当点击按钮后跳转到页面B。这个时候弹框1覆盖住了页面B,这不是我想要的。如何实现弹框1归属页面A,当打开页面B的时候,页面B是覆盖在页面A和弹框1上的。

2 回复

以参考下方demo:

//index.ets
import Dialog from './Page'
import { common, Want } from '[@kit](/user/kit).AbilityKit';

[@Entry](/user/Entry)
[@Component](/user/Component)
export struct CustomDialog {
// 外部定义visible变量作为弹窗组件入参,控制弹窗显隐
[@State](/user/State) visible: boolean | undefined = false;

onPageShow(): void {
this.visible = AppStorage.get('DialogVis') === undefined ? false : AppStorage.get('DialogVis')
console.log('this.visible', this.visible)
}

build() {
Column({ space: 20 }) {
Button('打开弹窗')// 点击修改visible变量后,visible的值可以被Dialog组件监听并响应
.onClick(() => {
this.visible = !this.visible
AppStorage.SetOrCreate('DialogVis', this.visible)
})
// 通过双向绑定visible变量,实现外部控制弹窗
Dialog({
visible: $visible,
})
}
}
}

//page.ets
import router from '[@ohos](/user/ohos).router';

[@Component](/user/Component)
export default struct Dialog {
// 监听外部传入的visible变量,visible值发生变化时触发onChange回调函数
[@Watch](/user/Watch)("onChange") [@Link](/user/Link) visible: boolean;
onCancel?: () => void;
onConfirm?: () => void;
// 通过CustomDialogController的builder参数绑定弹窗组件CustomDialogView
private controller = new CustomDialogController({
builder: CustomDialogView({
visible: $visible,
onCancel: this.onCancel,
onConfirm: this.onConfirm,
}),
autoCancel: false,
})

/**
* 当visible的值变化时触发回调
*/
onChange(): void {
if (this.visible) {
this.controller.open();
} else {
this.controller.close();
}
}

// 二次封装的Dialog组件主要通过控制器控制弹窗,不需要任何界面
build() {
}
}

[@CustomDialog](/user/CustomDialog)
export struct CustomDialogView {
[@Link](/user/Link) visible: boolean;
controller: CustomDialogController;
// 弹窗交互事件参数,点击确认和取消按钮时的回调函数
onCancel?: () => void;
onConfirm?: () => void;

build() {
Row() {
Button('跳转')
.onClick(() => {
this.visible = false;
this.onCancel?.();
router.pushUrl({ url: "pages/Page1" })
})
Button('关闭')
.onClick(() => {
this.visible = false;
this.onCancel?.();
this.controller.close()
})
}
}
}

//page1.ets
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Page1 {
[@State](/user/State) message: string = 'Hello World';

build() {
RelativeContainer() {
Text(this.message)
.id('Page1HelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
}

更多关于HarmonyOS 鸿蒙Next:如何在页面B打开时覆盖页面A及其弹框customDialog1的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,若你希望在页面B打开时覆盖页面A及其弹框customDialog1,可以通过以下方式实现:

  1. 页面跳转逻辑:在触发页面B打开的操作中,确保页面A的当前活动状态被正确管理。通常,通过页面跳转API(如startAbility)启动页面B时,页面A会进入后台,如果页面A设置了合适的生命周期管理,其上的弹框(如customDialog1)通常会被系统自动处理。

  2. 弹框管理:在页面A的onStoponDestroy生命周期方法中,主动关闭customDialog1。这可以确保在跳转到页面B之前,页面A上的弹框已经被清除,避免覆盖问题。

  3. 页面B的显示设置:确保页面B的启动配置正确,设置为全屏或覆盖模式,以便在启动时能够完全覆盖之前的页面和弹框。

  4. 测试与验证:在实际设备上测试页面跳转逻辑,验证页面B是否能够正确覆盖页面A及其弹框。

如果上述步骤正确实施后,问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!