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 ability
     LogUtil.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 Want
     this.toDetailPageFormUrl(want)
+    this.windowStage = windowStage
+
   }
 
   onWindowStageDestroy() {
@@ -86,10 +146,12 @@ export default class MainAbility extends Ability {
   onForeground() {
     // Ability has brought to foreground
     LogUtil.log("[Main] MainAbility onForeground")
+    this.isBackground = false
   }
 
   onBackground() {
     // Ability has back to background
     LogUtil.log("[Main] MainAbility onBackground")
+    this.isBackground = true
   }
 };
相关推荐
娅娅梨2 小时前
HarmonyOS-ArkUI Web控件基础铺垫4--TCP协议- 断联-四次挥手解析
网络协议·tcp/ip·http·okhttp·harmonyos·arkui·arkweb
coniting1233 小时前
【华为】交换机vlan互访实验
网络·华为
江湖有缘3 小时前
基于华为openEuler系统安装DailyNotes个人笔记管理工具
笔记·华为
zhanshuo8 小时前
干掉复杂逻辑!手把手教你在鸿蒙系统中创建稳定的后台服务
harmonyos
zhanshuo8 小时前
鸿蒙系统通知开发全攻略:实现跳转、自动消失、消息提醒的完整教程
harmonyos
问道飞鱼8 小时前
【移动端知识】移动端多 WebView 互访方案:Android、iOS 与鸿蒙实现
android·ios·harmonyos·多webview互访
周胡杰9 小时前
鸿蒙加载预置数据库-关系型数据库-如何读取本地/预制数据库
数据库·华为·harmonyos·鸿蒙
脑子缺根弦10 小时前
融合优势:SIP 广播对讲联动华为会议 全场景沟通响应提速
华为·音视频·广播对讲系统
迷曳19 小时前
27、鸿蒙Harmony Next开发:ArkTS并发(Promise和async/await和多线程并发TaskPool和Worker的使用)
前端·华为·多线程·harmonyos
呆呆的小鳄鱼1 天前
牛客:HJ24 合唱队[华为机考][最长递增子集][动态规划]
算法·华为·动态规划