HarmonyOS 鸿蒙Next开发输入法app,怎样设置panel背景?

HarmonyOS 鸿蒙Next开发输入法app,怎样设置panel背景? 我需要设置输入法键盘的背景,颜色要延伸到底部导航条,应该怎么做?目前已经实现了DARK_IMMERSIVE和LIGHT_IMMERSIVE的响应,但是我需要导航条的颜色与主题背景色一致,应该怎么做?


更多关于HarmonyOS 鸿蒙Next开发输入法app,怎样设置panel背景?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

尊敬的开发者,您好,可参考以下原理:

  • 前台应用根据应用场景,设置应用期望的沉浸模式。
  • 输入法框架在拉起输入法应用时会将前台应用期望的沉浸模式传递给输入法应用。
  • 输入法应用根据前台应用的沉浸模式决定最终的沉浸模式,并设置最终沉浸模式给输入法框架。

接入指导可参考官网的文档:输入法应用沉浸模式

更多关于HarmonyOS 鸿蒙Next开发输入法app,怎样设置panel背景?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


通过window.setWindowSystemBarProperties方法应该可以吧?统一设置导航条背景色和图标颜色:

调用时指定navigationBarColor为与键盘背景一致的颜色值。同时设置navigationBarContentColor为对比明显的颜色(如深色背景用浅色图标),确保导航图标可见。

import window from '@kit.ArkUI';
// 在主题变更或初始化时调用
setNavBarColor(backgroundColor: ResourceColor) {
  let windowClass = window.getLastWindow(this.context);
  windowClass.setWindowSystemBarProperties({
    navigationBarColor: backgroundColor,
    navigationBarContentColor: Color.White // 根据背景亮度调整
  });
}

这个场景确实不能按普通 UIAbility 的安全区来处理,输入法键盘是 InputMethodExtensionAbility 创建的 Panel,expandSafeArea 只对普通 ArkUI 页面有效,对 IME Panel 下方系统导航区域通常不起作用。

输入法侧目前推荐走 IME Kit 的沉浸模式链路:前台编辑框通过 keyboardAppearance(KeyboardAppearance.IMMERSIVE) 表达期望,输入法在 editorAttributeChanged 中读取 attr.immersiveMode,然后对 Panel 调 setImmersiveMode(inputMethodEngine.ImmersiveMode.LIGHT_IMMERSIVE/DARK_IMMERSIVE)。

也就是说,输入法能控制的是“沉浸模式及导航区前景适配”,不是像普通窗口那样随意指定导航条背景色。建议键盘根布局自身铺满 Panel 背景色,再根据主题选择 LIGHT_IMMERSIVE 或 DARK_IMMERSIVE,保证导航条图标可见。如果你要求导航条区域严格等于某个自定义色值,目前公开能力里未看到 IME Panel 可直接设置系统导航条背景色的接口。

InputExtension输入法面板是系统独立悬浮服务窗口,UIAbility通用的expandSafeArea天生不生效。

需要在窗口生命周期开启全屏布局、关闭系统避让模式,关闭布局裁剪,使用SafeAreaType.KEYBOARD专属键盘安全区向下扩展绘制,让键盘背景延伸覆盖底部导航栏,配合深浅主题回调实现无缝沉浸式背景。

组件和导航条颜色不同时,可以使用expandSafeArea属性扩展安全区域属性进行调整。

// xxx.ets
@Entry
@Component
struct Example {
  build() {
    Column() {
      Row() {
        Text('Top Content').fontSize(40).textAlign(TextAlign.Center).width('100%')
      }.backgroundColor('#2786d9')
      // 设置顶部绘制延伸到状态栏
      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])

      Row() {
        Text('Display Content 2').fontSize(30)
      }.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')

      Row() {
        Text('Display Content 3').fontSize(30)
      }.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')

      Row() {
        Text('Display Content 4').fontSize(30)
      }.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')

      Row() {
        Text('Display Content 5').fontSize(30)
      }.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')

      Row() {
        Text('Bottom Content').fontSize(40).textAlign(TextAlign.Center).width('100%')
      }.backgroundColor('#96dffa')
      // 设置底部绘制延伸到导航区域
      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
    }
    .width('100%').height('100%')
    .alignItems(HorizontalAlign.Center)
    .backgroundColor('#d5d5d5')
    .justifyContent(FlexAlign.SpaceBetween)
  }
}

这个不是普通UIAbility页面,这是输入法panel,使用expandSafeArea完全没有效果的,就是因为有难度才来提问,

在HarmonyOS NEXT中,输入法应用的panel背景可通过InputMethodExtensionsetCustomBackground()方法设置,传入PixelMap或颜色资源。也可在resources/base/element/color.json中定义颜色,并在布局文件panel_layout.xml的根容器添加ohos:background_element="$color:custom_bg"。需在onCreateInputConnection()中加载布局并应用背景。

InputMethodExtensionAbilityonCreate() 或 Panel 页面 onAppear 中,获取当前 Window 并设置导航栏背景为透明或与主题色一致,同时启用沉浸式全屏布局,使键盘背景延伸到导航条区域。示例代码:

import window from '@ohos.window';
import { InputMethodExtensionAbility } from '@kit.InputMethodKit';

export default class MyInputAbility extends InputMethodExtensionAbility {
  onCreate() {
    let win = window.getLastWindow(this.context);
    win.setWindowLayoutFullScreen(true);
    win.setSystemBarProperties({
      navigationBarColor: '#00000000', // 透明或主题色
      navigationBarContentColor: '#FFFFFF' // 图标颜色
    });
  }
}

若需跟随主题变化的颜色,可在已实现的暗/亮沉浸式回调中动态调用 setSystemBarProperties 并传入对应背景色值。Panel 内容区域需设置宽高 100%,背景色填满全屏即可自然延伸至导航条。

回到顶部