HarmonyOS鸿蒙Next中createSubWindow创建的悬浮窗口中返回不生效如何解决
HarmonyOS鸿蒙Next中createSubWindow创建的悬浮窗口中返回不生效如何解决
【问题现象】
如下图所示,在使用createSubWindow
创建的subWindow
弹出后,返回时,界面无法退出。
【背景知识】
解决上述问题需要先了解焦点事件。窗口管理的结构图如下图所示:
创建悬浮窗子Window
时,主要依赖windowStage
,windowStage
叫做窗口管理器,Window
是窗口管理器下的实例,用户可见的界面是由window.setUIContent
关联到对应的Page
页面,然后进行渲染展示。
【定位思路】
用户点击返回不生效,一般是因为事件没有传递到对应的Page
上去,可以先考虑是否是事件被拦截,如果事件没有拦截,再考虑焦点是不是丢失,没有聚焦到对应的Page
页中。
【解决方案】
方案一:关闭悬浮窗的聚焦
关闭聚焦又有两种思路可以实现,两种方法如下:
方法1:在布局展示成功后,关闭悬浮窗口的焦点
可参考官网window窗口焦点设置,核心代码如下:
subWindow.setWindowFocusable(false)
方法2:将子窗口的焦点转移到主窗口
核心代码如下:
onPageShow(): void {
setTimeout(() => {
// 获取子窗口ID
let subWindowID: number = window.findWindow('subWindow').getWindowProperties().id;
// 获取主窗口ID
let mainWindowID: number = this.windowStage.getMainWindowSync().getWindowProperties().id;
// 将焦点从子窗口转移到主窗口
window.shiftAppWindowFocus(subWindowID, mainWindowID);
}, 500);
}
方案二:手动destroy
子窗口
监听onBackPress
以后,关闭悬浮窗,核心代码如下:
destroySubWindow() {
// subWindow是子窗口
if (subWindow == null) {
console.error('Failed to create the subwindow. Cause: windowStage_ is null');
} else {
subWindow.destroyWindow((err) => {
if (err.code) {
console.error('Failed to destroy the subWindow. Cause: ' + JSON.stringify(err));
return;
}
console.info('Succeeded in destroying the subWindow.');
});
}
}
更多关于HarmonyOS鸿蒙Next中createSubWindow创建的悬浮窗口中返回不生效如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中createSubWindow创建的悬浮窗口中返回不生效如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用createSubWindow
创建的悬浮窗口返回不生效
在HarmonyOS鸿蒙Next中,使用createSubWindow
创建的悬浮窗口返回不生效,可能是焦点事件未传递到对应Page或焦点丢失。解决方案如下:
1. 关闭悬浮窗的聚焦
- 方法1:在布局展示成功后,使用
subWindow.setWindowFocusable(false)
关闭悬浮窗口的焦点。 - 方法2:将子窗口的焦点转移到主窗口,使用
window.shiftAppWindowFocus(subWindowID, mainWindowID)
。
2. 手动销毁子窗口
- 监听
onBackPress
事件,使用subWindow.destroyWindow()
手动销毁子窗口。
通过以上方法可解决返回不生效的问题。