HarmonyOS鸿蒙Next中调用createSubWindow的问题

HarmonyOS鸿蒙Next中调用createSubWindow的问题 为实现悬浮按钮的效果,可以在主工程中,首先创建页面文件,也就是悬浮按钮的界面,然后在main_pages中注册页面,然后调用createSubWindow展示页面。代码大致如下:

//main_pages.json文件
{
  "src": [
    "pages/Index",
    "pages/FloatView"
  ]
}
//FloatView文件
@Component
export struct FloatView {
  //省略代码
}
//Index页面中加载悬浮按钮的逻辑
@Entry
@Component
struct Index {
  @StorageLink('windowStage') windowStage: window.WindowStage | undefined = AppStorage.get('windowStage');

  build(){
    Row() {
      Button().onClick(() => {
        if(!this.windowStage) {
          return
        }
        this.windowStage?.createSubWindow('FloatView', (err, windowClass) => {
          windowClass.setUIContent('pages/FloatView', () => {
              windowClass.setWindowBackgroundColor('#00000000');
            });
            windowClass.moveWindowTo(0, 200)
            windowClass.resize(vp2px(75), vp2px(75))
            windowClass.showWindow();
            windowClass.setWindowLayoutFullScreen(true);
        })
      })
    }
  }
}

如上逻辑在主工程中没有问题。

现在的诉求是,如果我想要将这样的逻辑封装在har中,由于har中没有main_pages.json的配置,导致页面不显示。

请问如何在har中实现类似的效果?


更多关于HarmonyOS鸿蒙Next中调用createSubWindow的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

你好

可以将subwindow创建相关的代码封装在HAR包中。而悬浮窗加载的UI界面pages/floatview,放在主工程中。

或者使用HSP,可以创建main_pages.json

更多关于HarmonyOS鸿蒙Next中调用createSubWindow的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,createSubWindow用于创建子窗口,通常用于实现悬浮窗、弹窗等场景。调用时需在主线程中通过WindowStage的createSubWindow方法实现,传入SubWindowInfo配置参数,如窗口类型、尺寸、位置等。子窗口需绑定UIAbilityContext,并可通过loadContent加载页面内容。注意子窗口生命周期独立管理,需在适当时机调用destroySubWindow销毁。

在HarmonyOS Next中,HAR(Harmony Archive)包主要用于封装UI组件、业务逻辑和资源,但其设计上不支持独立的页面路由配置(如main_pages.json)。因此,直接在HAR中调用createSubWindow并传入页面路径会遇到页面无法加载的问题,因为主工程无法识别HAR内部的页面路径。

解决方案:通过回调函数或自定义弹窗组件实现

由于HAR不能直接配置页面路由,建议通过以下两种方式实现悬浮按钮效果:

  1. 回调函数方式:在HAR中暴露接口,由主工程传入页面内容。

    • 在HAR中封装一个方法,接收主工程传入的WindowStage和页面构建函数。
    • 主工程调用该方法时,传入FloatView的构建逻辑(例如@Builder函数)。
    • HAR内部使用createSubWindow并调用setUIContent加载主工程传入的构建函数。

    示例代码(HAR侧)

    // HAR中的工具类
    export class FloatWindowUtils {
      static showFloatWindow(
        windowStage: window.WindowStage, 
        builder: () => void
      ) {
        windowStage.createSubWindow('float', (err, windowClass) => {
          windowClass.setUIContent(builder, () => {
            windowClass.setWindowBackgroundColor('#00000000');
          });
          windowClass.moveWindowTo(0, 200);
          windowClass.resize(vp2px(75), vp2px(75));
          windowClass.showWindow();
        });
      }
    }
    

    主工程调用

    // 在主工程Index页面中
    import { FloatWindowUtils } from 'your_har';
    
    [@Entry](/user/Entry)
    [@Component](/user/Component)
    struct Index {
      @StorageLink('windowStage') windowStage: window.WindowStage | undefined;
    
      @Builder floatViewBuilder() {
        // 这里是主工程定义的FloatView内容
        FloatView()
      }
    
      build() {
        Button('显示悬浮窗').onClick(() => {
          if (this.windowStage) {
            FloatWindowUtils.showFloatWindow(this.windowStage, this.floatViewBuilder);
          }
        })
      }
    }
    
  2. 自定义弹窗组件方式:将悬浮按钮设计为HAR中的普通组件,通过[@Component](/user/Component)和弹窗控制实现。

    • 在HAR中创建FloatView组件(非页面)。
    • 在主工程中通过弹窗(如CustomDialog)或绝对定位加载该组件。
    • 这种方式更简单,但依赖于主工程的布局管理。

关键点总结

  • HAR不支持独立页面路由,因此不能直接使用createSubWindow加载HAR中的页面路径。
  • 推荐将页面构建逻辑下沉到主工程,HAR仅封装窗口管理功能。
  • 如果悬浮窗内容完全在HAR中,需改为组件形式,通过主工程弹窗或动态加载显示。

以上方法可保持HAR的复用性,同时兼容HarmonyOS Next的窗口管理机制。

回到顶部