【HarmonyOS】输入框焦点控制实现键盘显隐和进入页面默认弹出键盘获取焦点设置
在 HarmonyOS 中控制输入框的焦点与键盘显隐核心思路是通过defaultFocus实现页面进入自动获焦通过focusControl.requestFocus实现动态切换并通过onFocus/onBlur监听状态变化。以下是具体实现方案。一、核心原理输入框TextInput与键盘的联动遵循一个基本规则键盘的显隐与输入框的焦点状态绑定。当一个输入框获得焦点时系统软键盘会自动弹出当它失去焦点时键盘会收起 。二、进入页面默认弹出键盘在页面加载后希望输入框自动获得焦点并弹出键盘最直接的方式是使用defaultFocus属性。typescriptTextInput() .id(myInput) .defaultFocus(true) // 页面首次进入时该组件自动获焦弹出键盘 .onFocus(() { console.log(输入框已获焦键盘弹出); })注意事项defaultFocus仅在页面初次创建并第一次进入时生效。对于被if条件控制显隐的自定义组件或二次进入页面时它不会生效 。若页面内多个组件设置了defaultFocus(true)系统会以组件树深度遍历找到的第一个为准 。API 11 行为变更在 API 11 及之后版本如果没有任何组件设置defaultFocus(true)页面首次打开时默认焦点将落在根容器上而不会自动聚焦到第一个可获焦的非容器组件 。三、主动控制焦点与键盘显隐当你需要动态控制键盘弹出或收起如点击按钮让某个输入框获焦或点击空白区域收起键盘时可以使用focusControl。1. 主动获取焦点弹出键盘调用requestFocus方法让焦点转移到指定的输入框上从而拉起键盘。typescript// 推荐写法API 12 及以上可捕获错误码 this.getUIContext().getFocusController().requestFocus(myInput); // 或传统写法 focusControl.requestFocus(myInput);应用场景当某个输入框因被if隐藏后重新显示需要自动获焦时可在显示逻辑后调用此方法 。2. 主动清除焦点收起键盘调用clearFocus方法将焦点强制转移到页面的根容器上此时所有输入框失去焦点键盘收起。typescriptthis.getUIContext().getFocusController().clearFocus();另一种技巧通过动态修改focusable属性为false也可以强制当前输入框失去焦点焦点会转移到下一个可获焦的组件 。四、监听焦点状态与键盘显隐1. 监听焦点变化通过onFocus和onBlur回调可以精确感知输入框的获焦和失焦瞬间。typescriptTextInput() .onFocus(() { // 获焦逻辑例如修改UI样式记录埋点 }) .onBlur(() { // 失焦逻辑例如校验输入内容 })2. 监听键盘高度变化判断键盘显隐除了焦点监听有时业务需要监听键盘的弹出与收起例如调整页面布局。可以通过窗口模块监听键盘高度变化 。typescriptimport { window } from kit.ArkUI; let windowClass: window.Window | undefined undefined; window.getLastWindow(this.context, (err, data) { windowClass data; // 监听键盘高度变化 windowClass.on(keyboardHeightChange, (height: number) { if (height 0) { console.log(键盘已弹出高度为 height); // 执行键盘弹出时的UI适配逻辑 } else { console.log(键盘已收起); // 执行键盘收起时的UI适配逻辑 } }); });五、进阶控制与特性1.enableKeyboardOnFocus获焦不弹键盘默认情况下输入框获焦就会弹键盘。若你希望输入框获得焦点例如用于粘贴操作但暂时不弹出键盘可以将此属性设为false。typescriptTextInput() .defaultFocus(true) .enableKeyboardOnFocus(false) // 获焦了但不弹键盘2. 自定义键盘完全接管键盘逻辑如果需要使用自定义组件替代系统键盘可以利用customKeyboard属性。此时输入框获焦后不会弹出系统键盘而是显示你定义的自定义组件 。typescriptBuilder function MyCustomKeyboard() { Column() { Button(自定义按键1) Button(自定义按键2) } .width(100%) .backgroundColor(Color.Gray) } TextInput() .customKeyboard(MyCustomKeyboard()) // 获焦后显示自定义键盘六、常见问题 FAQ1. 为什么defaultFocus(true)在自定义组件中不生效defaultFocus仅在页面Page首次创建时生效。如果自定义组件是在页面加载后动态渲染如被if控制需要使用requestFocus主动请求焦点 。2. 如何调试复杂的焦点问题查看焦点树通过hdc shell hidumper -s WindowManagerService -a -w [winId] -focus可以输出当前界面的焦点树*标记的节点即为当前获焦节点 。过滤焦点日志在真机上根据关键词AceFocus|AceKeyboard过滤日志有助于排查焦点与键盘的联动问题 。