HarmonyOS 鸿蒙Next底部小白条沉浸式适配问题

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

这是我的代码,我在EntryAbility已经加入

async function enterImmersion(windowClass: window.Window) {
  // 获取状态栏和导航栏的高度
  windowClass.on("avoidAreaChange", ({ type, area }) => {
    if (type == window.AvoidAreaType.TYPE_SYSTEM) {
      // 将状态栏和导航栏的高度保存在AppStorage中
      AppStorage.SetOrCreate<number>("topHeight", area.topRect.height);
      AppStorage.SetOrCreate<number>("bottomHeight", area.bottomRect.height);
    }
  })
  // 设置窗口布局为沉浸式布局
  await windowClass.setWindowLayoutFullScreen(true)
}

达到沉浸

import HomeComponent from './components/HomeComponent'
import MeComponent from './components/MeComponent'
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import router from '@ohos.router';
import promptAction from '@ohos.promptAction';
import PermissionUtils from './utils/PermissionUtils';
import ScanComponent from './components/ScanComponent';

let statusHeight = AppStorage.Get('topHeight') as number
let navigateHeight = AppStorage.Get('bottomHeight') as number

const permissions: Array<Permissions> = ['ohos.permission.CAMERA', 'ohos.permission.READ_MEDIA'];

@Entry
@Component
struct Index {
  @State username: string = ''
  @State titles: Array<string> = ['主页', '我的']
  @State currentIndex: number = 0;
  @State permissonFlag: boolean = false
  private controller: TabsController = new TabsController()

  @Builder
  TabBuilder(title: string, targeIndex: number, selectImg: Resource, normalImg: Resource, length?: number) {
    Column() {
      Image(this.currentIndex == targeIndex ? selectImg : normalImg)
        .size({
          width: 25,
          height: 25
        })
        .margin({
          top: 5
        })
      Text(title)
        .fontColor(this.currentIndex == targeIndex ? '#28bff1' : '#8a8a8a')
        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
    }
    .backgroundColor('#f0f0f0')
    .width('100%')
    .height('100%')
    .onClick(() => {
      this.currentIndex = targeIndex
      this.controller.changeIndex(targeIndex)
    })
  }

  @Builder
  NavigationMenus() {
    Row() {
      NavRouter() {
        Column() {
          Image($r('app.media.ic_public_input_scan'))
            .width(24)
            .height(24)
          Text('扫一扫')
            .fontSize(10)
        }

        NavDestination() {
          ScanComponent()
        }
        .title('扫一扫')
        .backgroundColor(Color.White)
      }
    }
  }

  build() {
    Row() {
      Column() {
        Navigation() {
          Tabs({
            barPosition: BarPosition.End,
            controller: this.controller
          }) {
            TabContent() {
              HomeComponent()
            }
            .tabBar(this.TabBuilder('主页', 0, $r('app.media.home_press'), $r('app.media.home')))

            TabContent() {
              MeComponent()
            }
            .tabBar(this.TabBuilder('我的', 1, $r('app.media.me_press'), $r('app.media.me')))
          }
          .scrollable(false)
          .onChange((index) => {
            this.currentIndex = index
          })

        }
        .titleMode(NavigationTitleMode.Mini)
        .hideBackButton(true)
        .title(this.titles[this.currentIndex])
        .mode(NavigationMode.Auto)
        .navBarWidth(360)
        .menus(this.NavigationMenus())
        .width('100%')
        .height('100%')
      }
      .width('100%')
      .height('100%')
    }
    .width('100%')
    .height('100%')
    .padding({
      top: px2vp(statusHeight),
    })
  }
}

我在主页面底部导航栏自定义组件TabBuilder内底部文字加入了.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]),但是调试时底部白条并未沉浸效果如下image.png各位大佬有知道的吗

6 回复

设置expandSafeArea无效.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.START, SafeAreaEdge.TOP, SafeAreaEdge.END])

你要过去小白条的高度,你这里的导航栏高度是0,小白条叫navigationIndicator

看文档的@ohos.window

针对HarmonyOS 鸿蒙Next底部小白条沉浸式适配问题,以下是一些专业的解决方案:

  1. 全屏布局设置:通过调用setWindowLayoutFullScreen()接口设置窗口全屏,这样可以让应用界面延伸到状态栏和导航条区域,实现沉浸式效果。
  2. 获取避让区域:使用getWindowAvoidArea()接口获取状态栏、导航条等布局遮挡区域的高度,以便在布局中对具体控件进行避让处理。
  3. 组件安全区扩展:通过设置expandSafeArea属性,允许组件绘制内容突破安全区域的限制,延伸到状态栏和导航条区域。但请注意,设置此属性时组件不能设置固定宽高尺寸(百分比除外)。
  4. UI元素避让:除了导航条底部区域可以响应点击事件外,其他可交互UI元素和应用关键信息不建议放到导航条区域。

如果以上方案仍无法解决您的问题,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html。他们将为您提供更专业的技术支持和解决方案。

回到顶部