OpenHarmony 5.0设置应用设置手势导航开关打开后重新关闭导航栏和设置界面重合
目录
1.背景
2.解决方案
1.背景
在OpenHarmony 5.0中从设置界面打开手势导航开关然后重新关闭,此时设置界面导航栏和设置列表主界面重合,导致设置界面无法点击最下面的关于设备
2.解决方案
首先参考之前的如何设置导航栏文档,我们可以自己再重新设置下导航栏样式及是否显示,然后在设置是否开始手势导航有一个
settings.display.navigationbar_status
属性,我们根据这个属性强制显示和隐藏导航栏
最终的patch如下:
@@ -22,8 +22,14 @@ import AbilityConstant from '@ohos.app.ability.AbilityConstant';import window from '@ohos.window';import router from '@ohos.router';import { UIContext } from '@ohos.arkui.UIContext';
+import { BusinessError } from '@ohos.base';
+import settings from '@ohos.settings';
+export default class MainAbility extends Ability {private funcAbilityWant;
+ private windowStage:window.WindowStage;
+ private isBackground = false
+onCreate(want, launchParam) {AppStorage.SetOrCreate('newWant', want);@@ -39,10 +45,61 @@ export default class MainAbility extends Ability {}onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {AppStorage.SetOrCreate('newWant', want);
-
+ this.setNavigationBarStatus();
+ setTimeout(()=>{
+ this.setNavigationBarStatus();
+ },500);this.toDetailPageFormUrl(want)}+ private setNavigationBarStatus() {
+ if (this.isBackground) {
+ return
+ }
+ const initValue = settings.getValueSync(this.context, 'settings.display.navigationbar_status', '1');
+ const navigationBarStatusValue = initValue === '0' ? false : true;
+ LogUtil.error("navigationBarStatusValue"+navigationBarStatusValue);
+ if (this.windowStage) {
+ let windowClass: window.Window | undefined = undefined;
+ this.windowStage.getMainWindow((err: BusinessError, data) => {
+ const errCode: number = err.code;
+ if (errCode) {
+ console.error(`Failed to obtain the main window. Cause code: ${err.code}, message: ${err.message}`);
+ return;
+ }
+
+ // 2.实现沉浸式效果:设置导航栏、状态栏显示。
+ // let names = ['status', 'navigation'];
+ // 2.实现沉浸式效果:设置导航栏、状态栏不显示。
+ let names: Array<'status' | 'navigation'> = ['status'];
+ if (navigationBarStatusValue) {
+ names = ['status', 'navigation'];
+ }
+
+ windowClass = data;
+ windowClass.setWindowSystemBarEnable(names);
+ let SystemBarProperties: window.SystemBarProperties = {
+ //状态栏和导航栏背景颜色
+ statusBarColor: '#ffffff',
+ navigationBarColor: '#ffffff',
+ //以下两个属性从API Version8开始支持,状态栏和导航栏内容颜色
+ statusBarContentColor: '#000000',
+ navigationBarContentColor: '#000000'
+ };
+ try {
+ let promise = windowClass.setWindowSystemBarProperties(SystemBarProperties);
+ promise.then(() => {
+ console.info('Succeeded in setting the system bar properties.');
+ }).catch((err: BusinessError) => {
+ console.error(`Failed to set the system bar properties. Cause code: ${err.code}, message: ${err.message}`);
+ });
+ } catch (exception) {
+ console.error(`Failed to set the system bar properties. Cause code: ${exception.code}, message: ${exception.message}`);
+ }
+ });
+ }
+ }
+toDetailPageFormUrl(want) {window.getLastWindow(this.context).then((window: window.Window) => {let UIContext: UIContext = window.getUIContext();
@@ -54,6 +111,7 @@ export default class MainAbility extends Ability {}, router.RouterMode.Single)})}
+onWindowStageCreate(windowStage) {// Main window is created, set main page for this abilityLogUtil.log("[Main] MainAbility onWindowStageCreate")
@@ -76,6 +134,8 @@ export default class MainAbility extends Ability {GlobalContext.getContext().setObject(GlobalContext.globalKeySettingsAbilityContext, this.context);let want = GlobalContext.getContext().getObject(GlobalContext.globalKeyAbilityWant) as Wantthis.toDetailPageFormUrl(want)
+ this.windowStage = windowStage
+}onWindowStageDestroy() {
@@ -86,10 +146,12 @@ export default class MainAbility extends Ability {onForeground() {// Ability has brought to foregroundLogUtil.log("[Main] MainAbility onForeground")
+ this.isBackground = false}onBackground() {// Ability has back to backgroundLogUtil.log("[Main] MainAbility onBackground")
+ this.isBackground = true}};