HarmonyOS鸿蒙Next中createSubWindow创建的悬浮窗口中返回不生效如何解决

HarmonyOS鸿蒙Next中createSubWindow创建的悬浮窗口中返回不生效如何解决

【问题现象】

如下图所示,在使用createSubWindow创建的subWindow弹出后,返回时,界面无法退出。

点击放大

【背景知识】

解决上述问题需要先了解焦点事件。窗口管理的结构图如下图所示:

窗口管理结构图

创建悬浮窗子Window时,主要依赖windowStagewindowStage叫做窗口管理器,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

1 回复

更多关于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()手动销毁子窗口。

通过以上方法可解决返回不生效的问题。

回到顶部