HarmonyOS 鸿蒙Next 获取statusBar的高度是,在某些场景下获取到的高度为0
HarmonyOS 鸿蒙Next 获取statusBar的高度是,在某些场景下获取到的高度为0 背景: 由于app获取window信息中有些属性是异步的,为了在UI布局中能够同步使用,我们目前的解决方案是启动时,获取statusbar的高度,并在app生命周期内,单例持有屏幕特征的值,如statusbar的高度和底部导航条的高度。 获取statusbar的高度的方法:getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM) 在正常打开app的情况下都能正确的获取到相应的值。然而,在做扫码直达,系统拉起app是,app内获取到的statusbar的高度却为0。
更多关于HarmonyOS 鸿蒙Next 获取statusBar的高度是,在某些场景下获取到的高度为0的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
请问你是使用以下代码后,在做扫码直达,系统拉起app时,app内获取到的statusbar的高度却为0。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
}
onDestroy(): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
}
onWindowStageCreate(windowStage: window.WindowStage): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
windowStage.loadContent('pages/Index', (err) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in loading the content.');
let windowClass: window.Window = windowStage.getMainWindowSync(); // 获取应用主窗口
let type = window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR; // 以导航条避让为例
let avoidArea = windowClass.getWindowAvoidArea(type);
let bottomRectHeight = avoidArea.bottomRect.height; // 获取到导航条区域的高度
AppStorage.setOrCreate('bottomRectHeight', bottomRectHeight);
type = window.AvoidAreaType.TYPE_SYSTEM; // 以状态栏避让为例
avoidArea = windowClass.getWindowAvoidArea(type);
let topRectHeight = avoidArea.topRect.height; // 获取状态栏区域高度
console.info(`window_topRectHeight: ${topRectHeight}`)
AppStorage.setOrCreate('topRectHeight', topRectHeight);
});
}
onWindowStageDestroy(): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
}
onForeground(): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
}
onBackground(): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground')
}
}
getWindowAvoidArea需要和on(‘avoidAreaChange’)配合使用。
参考demo:
let windowClass: window.Window = windowStage.getMainWindowSync();
let topHeight = 0;
topHeight = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)?.topRect?.height;
windowClass.on('avoidAreaChange', (data) => {
if (data.type == window.AvoidAreaType.TYPE_SYSTEM) {
topHeight = data.area.topRect.height
console.log('topHeight 111', topHeight)
}
})
AppStorage.setOrCreate('topRectHeight', topHeight);
更多关于HarmonyOS 鸿蒙Next 获取statusBar的高度是,在某些场景下获取到的高度为0的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中获取statusBar的高度时,如果遇到在某些场景下获取到的高度为0的问题,这通常与系统的UI状态或者窗口属性有关。以下是可能的原因及解决方法概述:
-
UI状态未完全加载:在某些情况下,如果尝试在系统UI完全加载之前获取statusBar高度,可能会得到0。确保在UI线程且所有视图都已正确布局后执行获取操作。
-
窗口属性设置:检查应用的窗口属性,特别是与全屏模式或状态栏显示相关的设置。如果应用被设置为全屏显示且隐藏了状态栏,那么获取的高度自然会是0。
-
系统权限:确保应用具有访问系统UI状态的必要权限。虽然这通常与Java或C语言代码相关,但在鸿蒙系统中,权限管理也是影响UI元素访问的一个重要因素。
-
系统API使用:确认使用的API是鸿蒙系统推荐的,且适用于当前的系统版本。不同版本的鸿蒙系统可能提供了不同的API或修改了现有API的行为。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html 。这将帮助进一步诊断问题,并提供更具体的解决方案。