【HarmonyOS NEXT】解决:软键盘弹起导致页面整体上移、标题栏丢失的问题

一、背景

在开发鸿蒙 APP 登录页时,会遇到这样的体验问题,当用户点击输入框弹出软键盘时,整个页面会被默认的上推模式带起,导致顶部的标题栏被推出可视区域,严重影响用户体验。

备注:以下解决方法为(API 11+),低版本不适配哦!

二、具体问题

页面分为三个部分,顶部固定标题,中间是logo图标,底部是输入框。用户点击底部输入框时,页面弹出软键盘,顶部固定标题没有固定住,整体往上移动。

问题效果预览:图1是没弹出软键盘的场景,图2是弹出软键盘的场景。

问题代码示例如下:

TypeScript 复制代码
@Extend(TextInput)
function commonInputStyle(maxLength: number) {
  .placeholderColor('#999999')
  .borderRadius(8)
  .contentType(ContentType.PHONE_NUMBER)
  .caretStyle({ color: '#b35336', width: 2 })
  .height(48)
  .maxLength(maxLength)
  .maxLines(1)
  .type(InputType.Number)
  .fontColor('#333333')
  .width("100%")
  .backgroundColor(Color.White)
  .padding({ left: 16, right: 16 })
  .shadow({
    radius: 4,
    color: '#00000008',
    offsetY: 2
  })
}

@Entry
@Component
export struct Index {
  @State phoneNumber: string = ""
  @State codeNumber: string = ""

  build() {
    Column() {
      Stack({ alignContent: Alignment.Top }) {
        Column()
          .width('100%')
          .height('100%')
          .backgroundColor('#F8F9FA')

        // 标题栏
        Column() {
          Text('密码登录')
            .fontColor('#333333')
            .fontSize(20)
            .fontWeight(500)
            .margin({ top: 10 })

          // logo模块
          Image($r("app.media.startIcon"))
            .width(120)
            .objectFit(ImageFit.Contain)
            .margin({ top: 110, bottom: 60 })
            .borderRadius(16)
            .shadow({
              radius: 8,
              color: '#00000010',
              offsetY: 4
            })

          // 输入模块
          Column() {
            TextInput({
              text: this.phoneNumber,
              placeholder: "请输入手机号"
            })
              .commonInputStyle(11)
              .onChange((value: string) => {
                this.phoneNumber = value
              })
            TextInput({
              text: this.codeNumber,
              placeholder: "请输入短信验证码"
            })
              .commonInputStyle(6)
              .margin({ top: 20 })
              .onChange((value: string) => {
                this.codeNumber = value
              })
          }
          .width('100%')
          .padding({ top: 200, left: 32, right: 32 })
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Start)
      }
    }
    .width('100%')
    .height('100%')
  }
}

三、问题定位

3.1、确定问题

标题栏无固定布局,依赖页面整体排版,键盘弹起时随页面上移丢失

首先默认场景下UI是没有啥问题的,主要是在键盘弹起后UI整体上移了,那问题就出现键盘弹起的过程上,是没有正确配置键盘避让模式

3.2、键盘背景知识:

官网文档指引👉:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-uicontext-e#keyboardavoidmode11

KeyboardAvoidMode配置键盘避让页面的避让模式,其中KeyboardAvoidMode.RESIZE表示压缩模式

四、解决问题

核心方案:配置setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE)(API 11+)

解决软键盘弹出后顶部控件无法固定的问题,可以通过setKeyboardAvoidMode来配置虚拟键盘弹出时,页面的避让模式为压缩模式。

在aboutToAppear生命周期里面配置键盘避让模式为压缩模式👇

相关推荐
懿路向前4 小时前
HarmonyOS 粒子特效实战:emitter.size 是双刃剑:粒子精确定位 [0,0] 与条带随机出生(HarmonyOS)
华为·harmonyos
马剑威(威哥爱编程)5 小时前
【共创稿事节】HarmonyOS 7 Agent 开发实战 04:云端 RAG 搭企业私有知识库问答
人工智能·华为·harmonyos
贾伟康5 小时前
【晨迹相机|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
harmonyos·arkts·appgallery·发布审核·上架复查
特立独行的猫a6 小时前
用仓颉写桌面应用:从 npx 建工程到串口实时示波器
开源·harmonyos·tauri·仓颉·cj-tarui
m0_685535088 小时前
光学设计自学
华为·光学·光学设计·光学工程·镜头设计
懿路向前8 小时前
HarmonyOS 粒子特效实战:马赛克切块提速 17.6×~38×:desiredRegion 重复读盘与一次解码管线(HarmonyOS)
华为·harmonyos
垆边人似月.9 小时前
华为题:LRU 缓存
缓存·华为
天府云创9 小时前
Agentic开发时代到来——鸿蒙PC三大原生开发工具公测
华为·操作系统·harmonyos·鸿蒙系统·cli·deveco·agentic
程序猿追9 小时前
Fleks 鸿蒙适配:从八个小球看实体和组件的变化
华为·harmonyos
Sunny_GMF10 小时前
Markdown 导出 HTML 实战:2.6MB 编辑器快照如何瘦身 71%(DOM 净化 + CSSOM 运行时裁剪)
编辑器·html·ai编程·harmonyos