HarmonyOS 鸿蒙Next app内加载loading时禁止所有其他操作,除非强制退出应用

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next app内加载loading时禁止所有其他操作,除非强制退出应用

app内加载loading,禁止所有其他操作,除非强制退出应用

2 回复

您可以使用应用子窗口功能,相关文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-window-stage-V5

重点需要关注WindowStage的生命周期,在WindowStage生效后进行相关操作。

参考代码:

//EntryAbility.ets:

import AbilityConstant from '[@ohos](/user/ohos).app.ability.AbilityConstant';
import hilog from '[@ohos](/user/ohos).hilog';
import UIAbility from '[@ohos](/user/ohos).app.ability.UIAbility';
import Want from '[@ohos](/user/ohos).app.ability.Want';
import window from '[@ohos](/user/ohos).window';
import { BusinessError } from '[@ohos](/user/ohos).base';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      //子窗口创建
      let promise = windowStage.createSubWindow("subWindow");
      promise.then((data) => {
        globalThis.subWindow = data;
        globalThis.subWindow.setUIContent("pages/Page2")
        globalThis.subWindow.resize(800, 600);
        globalThis.subWindow.moveWindowTo(50, 150);
      })
        .catch((err: BusinessError) => {
          console.error('Failed to create the subwindow. Cause: ' + JSON.stringify(err));
        })
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    //子窗口销毁
    globalThis.subWindow.destroy();
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }

//Index.ets:

import
window
from
'[@ohos](/user/ohos).window'
import
{ BusinessError
}

from
'[@ohos](/user/ohos).base'

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
[@State](/user/State) message: string = '-----------'

//private windowClass:window.Window|null;
build() {
  Row() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Button() {
        Text("实验")
      }
      .width(80)
      .height(60)
      .onClick(() => {
        this.message = "实验已开始"
        //窗口显示
        globalThis.subWindow.showWindow();
      })
    }
    .width('100%')
  }
  .height('100%')
}
}

//Page2.ets:
import { BusinessError } from '[@ohos](/user/ohos).base'
import window from '[@ohos](/user/ohos).window'
import router from '[@ohos](/user/ohos).router'

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Page2 {
[@State](/user/State) message: string = '子窗口'

build() {
  Row() {
    Column() {
      Text(this.message)
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
      Button() {
        Text("隐藏")
      }
      .width(80)
      .height(60)
      .onClick(() => {
        try {
          //子窗口隐藏
          globalThis.subWindow.hide();
        } catch (exception) {
          console.error('Failed to create the window. Cause: ' + JSON.stringify(exception));
        }
      })
    }
    .width('100%')
  }
  .height('100%')
  .backgroundColor(Color.Green)
}
}

更多关于HarmonyOS 鸿蒙Next app内加载loading时禁止所有其他操作,除非强制退出应用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,如果你希望在Next应用内加载(loading)时禁止所有其他操作,直至加载完成或用户选择强制退出应用,可以通过以下方式实现:

  1. 全屏遮罩层:在加载界面上添加一个全屏的透明或半透明遮罩层,覆盖所有UI元素,使用户无法与界面进行交互。

  2. 禁用事件传递:确保遮罩层在布局层级上处于最上层,通过设置clickablefocusable属性为true,来阻止事件传递到下层可交互元素。

  3. 加载状态管理:在应用的逻辑层维护一个加载状态,当开始加载时将状态设为true,显示遮罩层并禁用其他操作;加载完成后将状态设为false,隐藏遮罩层并恢复操作。

  4. 退出机制:提供明确的退出路径,如设置应用内的退出按钮或在用户强制退出应用时(如按返回键多次)正确响应,确保应用能够安全退出。

示例代码(简化版,不涉及具体鸿蒙API):

<!-- XML布局文件 -->
<StackLayout>
    <LoadingView visibility="{loading ? 'visible' : 'gone'}"/>
    <Overlay clickable="true" focusable="true" visibility="{loading ? 'visible' : 'gone'}"/>
    <!-- 其他UI元素 -->
</StackLayout>

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

回到顶部