news 2026/6/26 12:52:43

【HarmonyOS NEXT】如何监听软键盘的弹出和收起事件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【HarmonyOS NEXT】如何监听软键盘的弹出和收起事件

一、背景

在开发鸿蒙 APP 登录页时,当输入框键盘弹起,需要改变logo图标与输入框的间距,让整个页面完全展示,提升用户体验

二、具体问题

默认情况下,logo图标与标题栏和输入框给的固定间距,页面能够完全展示,但当键盘弹起时,输入框被遮挡,用户输入了手机号或验证码,但完全看不到自己输入的内容,很影响用户体验

问题效果预览:

问题代码示例如下:

@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({ left: 32, right: 32 }) .margin({ top: 200 }) } .width('100%') .height('100%') .justifyContent(FlexAlign.Start) } } .width('100%') .height('100%') } }

三、期望效果

当点击输入框键盘弹起时,改变logo图标与标题栏和输入框的间距,让内容能够完全展现

四、解决方案

4.1、方案1:使用输入框的焦点事件

使用输入框的焦点事件:通过TextInput组件的onFocus和onBlur事件可以间接判断键盘的弹出和收起。当输入框获得焦点时,通常会触发键盘弹出;当输入框失去焦点时,键盘会收起。

@State inputMarginTop: number = 200; // 初始值:无键盘时输入框与logo的间距 @State logoMarginTop: number = 110; //初始值:无键盘时logo与标题的间距 TextInput({ text: this.phoneNumber, placeholder: "请输入手机号" }) .commonInputStyle(11) .onChange((value: string) => { this.phoneNumber = value }) .onFocus(() => { console.log('lucy== 手机号---输入框获焦,键盘已弹出'); this.inputMarginTop = 100 this.logoMarginTop = 50 }) .onBlur(() => { console.log('lucy== 手机号---输入框失焦,键盘已收起'); this.inputMarginTop = 200 this.logoMarginTop = 110 })

备注:此种场景会有个问题,假如有多个输入框,需要给每个输入框都设置焦点事件

4.2、方案2:开启固定态软键盘高度变化的监听

监听键盘高度变化:通过window.on('keyboardHeightChange')事件可以监听键盘的高度变化。当键盘弹出时,返回的高度值为非零值;当键盘收起时,返回的高度值为0。

currentWindow.on('keyboardHeightChange', (data) => { if (data > 0) { console.info('键盘高度大于0,键盘已弹出'); } else { console.info('键盘高度为0,键盘已收起'); } });

完整示例参考如下:

import { KeyboardAvoidMode, window } from '@kit.ArkUI'; @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 = "" @State inputMarginTop: number = 200; // 初始值:无键盘时输入框与logo的间距 @State logoMarginTop: number = 110; //初始值:无键盘时logo与标题的间距 aboutToAppear(): void { this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE); // 设置键盘避让模式 window.getLastWindow(this.getUIContext().getHostContext()).then(currentWindow => { currentWindow.on('keyboardHeightChange', (data) => { if (data > 0) { console.log('lucy== 键盘高度大于0,键盘已弹出'); this.inputMarginTop = 100 this.logoMarginTop = 50 } else { console.log('lucy== 键盘高度为0,键盘已收起'); this.inputMarginTop = 200 this.logoMarginTop = 110 } }); }); } 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: this.logoMarginTop, 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({ left: 32, right: 32 }) .margin({ top: this.inputMarginTop }) } .width('100%') .height('100%') .justifyContent(FlexAlign.Start) } } .width('100%') .height('100%') } }

4.3、实现效果

实现效果:键盘弹起时输入框不会被遮挡

结论:我选择的是方案二,因为当输入框多的情况下,需要给每个输入框添加焦点事件,而方案二只用监听键盘的高度变化来适配间距,更适合我当下的场景

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 1:25:55

固定翼无人机俯仰姿态模糊PID控制(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

固定翼无人机俯仰姿态模糊PID控制(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 内容包含飞行动力学建模、模型特性分析、控制器设计。程序,仿真,word报告。 通过对无人机进行受力分析和力矩分析&…

作者头像 李华
网站建设 2026/6/19 5:17:24

‌AI驱动的测试环境配置检查清单:全面指南

一、引言:测试环境配置的重要性与AI的赋能作用‌测试环境是软件测试的基石,一个配置不当的环境会导致虚假缺陷、延误发布,甚至业务风险。据统计,约30%的测试失败源于环境问题(来源:业界报告)。随…

作者头像 李华
网站建设 2026/5/27 4:39:41

领导说你潜力大,却不肯提拔你,只说明一件事

杰克韦尔奇有句管理格言:“在成为领导者之前,成功是关于自我成长;当你成为领导者之后,成功就是关于他人的成长。”话很有道理,但放在现实职场中往往还要补上一句潜台词:领导者确实需要他人成长,…

作者头像 李华
网站建设 2026/6/18 20:08:23

2026 年前端必会的 10 个现代 CSS 布局技巧

说句大实话。 到了 2026,前端的价值早就不止“看起来好看”。 你要管性能、管可维护性、管架构干不干净、管设计系统能不能扩展——还得顺手把 JavaScript 用量压下来,交付更好的体验。 如果你还在用几年前那套方式搭布局,你已经落后了。不是…

作者头像 李华
网站建设 2026/6/10 15:53:32

泊车十年演进

下面这份内容,不是“泊车功能升级清单”,也不是“APA → AVP 的产品路线图”,而是站在泊车作为“自动驾驶最早规模化落地的真实系统”视角,对未来十年的一次结构性演进判断。 🅿️ 泊车十年演进(2025–2035…

作者头像 李华
网站建设 2026/6/26 4:10:27

AI之LangChain:LangChain框架解读之工具调用和Agent逻辑实现细节梳理(并探讨与MCP和A2A关系)

AI之LangChain:LangChain框架解读之工具调用和Agent逻辑实现细节梳理(并探讨与MCP和A2A关系) 导读:“Prompt 定义灵魂(怎么想),Schema 定义双手(怎么做)。Python 函数的签名就是大模型的说明书,@tool 就是那台自动打印说明书的机器。” 目录 LangChain框架解读之工具调…

作者头像 李华