HarmonyOS 鸿蒙Next 4.2.0 获取导航栏高度问题

HarmonyOS 鸿蒙Next 4.2.0 获取导航栏高度问题 Hi Huawei developers: 

机型:Huawei Pura P70 Pro

系统:HarmonyOS 4.2.0.222

问题描述:

无论在系统设置中隐藏、显示手机底部导航栏,Android API 接口返回的 “navigation_bar_height” 值不变,始终为 136.

@SuppressLint(“DiscouragedApi”, “InternalInsetResource”) private fun Context.getResourceDimensionInPx(resourceName: String = “navigation_bar_height”): Int { var result = 0 val resourceId: Int = resources.getIdentifier(resourceName, “dimen”, “android”) if (resourceId > 0) { result = resources.getDimensionPixelSize(resourceId) } return result }

期望结果:

导航栏高度根据系统设置导航栏可见性而变化。

或者:

  1. 有没有其他方式也可以获取正确的导航栏高度?
  2. 如果导航栏不显示时,获取到的导航栏高度是不是为 0 呢?

感谢!🙏


更多关于HarmonyOS 鸿蒙Next 4.2.0 获取导航栏高度问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

比如下面两种现象:

  • 三星 Galaxy S24,接口返回导航栏高度值:
    1. 显示导航栏:144
    2. 隐藏导航栏:45
  • HUAWEI Pura 70 Pro 手机,接口返回导航栏高度值:
    1. 显示导航栏:136
    2. 隐藏导航栏:136

Huawei 手机获取到的导航栏高度值没有变化。

更多关于HarmonyOS 鸿蒙Next 4.2.0 获取导航栏高度问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next 4.2.0中,获取导航栏高度可通过window.getWindowAvoidArea接口实现。该接口返回一个AvoidArea对象,其中topRect属性包含了顶部安全区域(通常包含状态栏和导航栏)的矩形信息。通过计算topRect.height,即可获得导航栏高度。具体实现需在UIAbility的onWindowStageCreate生命周期中调用。

在HarmonyOS Next中,获取导航栏高度的方式与传统的Android API有所不同。您遇到的问题是因为在HarmonyOS上,android命名空间下的系统资源(如navigation_bar_height)可能不适用或行为不一致。

对于HarmonyOS Next,推荐使用ArkUI的自适应能力或查询窗口安全区域来动态处理导航栏等系统UI的占用空间,而不是直接查询一个固定的资源值。

核心解决方案:

  1. 使用窗口安全区(Safe Area)查询:这是处理系统UI(如导航栏、状态栏)最标准、最可靠的方法。您可以通过window模块获取窗口的默认显示区域和安全区域,两者的差值通常就包含了系统UI(如导航栏)的高度。

    // 示例代码 (ArkTS)
    import { window } from '@kit.ArkUI';
    
    // 获取窗口管理器实例
    let windowClass = window.getLastWindow(this.context);
    // 获取窗口的矩形区域,包含整个窗口
    let windowRect = windowClass.getWindowProperties().windowRect;
    // 获取安全区域矩形,即可用内容区域
    let safeArea = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
    
    // 底部安全区域(通常包含导航栏)
    let bottomSafeAreaHeight = safeArea.bottomRect.height;
    

    当导航栏隐藏时,bottomSafeAreaHeight的值通常为0或一个很小的值(仅包含手势指示条区域)。当导航栏显示时,此值即为导航栏的实际高度。您应该根据bottomSafeAreaHeight来动态调整您界面底部的布局。

  2. 避免使用Android兼容性资源ID:在HarmonyOS Next纯血版应用开发中,应完全使用ArkUI和HarmonyOS自身的API。通过resources.getIdentifier查询android命名空间的资源是不被推荐且可能失效的方法,因为它依赖于兼容层,行为不可预测。

直接回答您的疑问:

  • 有没有其他方式获取正确的导航栏高度? 有,如上所述,使用window.getWindowAvoidArea查询底部安全区域是正确的方式。
  • 如果导航栏不显示时,获取到的导航栏高度是不是为0? 当您使用安全区域查询时,如果导航栏被隐藏,bottomSafeAreaHeight返回的高度理论上应该接近0(可能仍包含极窄的手势区)。而您之前使用的Android资源查询方法返回的是一个静态的、预定义的资源值,它不会随系统设置动态改变。

总结: 请将代码迁移至使用@kit.ArkUIwindow模块的getWindowAvoidArea方法来动态获取安全区域信息,并据此计算可用布局空间。这是HarmonyOS Next应用处理此类问题的标准做法。

回到顶部