在HarmonyOS NEXT开发中获取焦点弹出键盘后,点击空白区域不能自动取消焦点?
在HarmonyOS NEXT开发中获取焦点弹出键盘后,点击空白区域不能自动取消焦点?
解决方案:
在ArkUI中需要手动处理点击空白区域隐藏键盘的操作,可以通过以下两种方式实现:
方法1:全局点击监听
// 在build方法外层声明控制器
@State inputText: string = ''
controller: TextInputController = new TextInputController()
build() {
Column() {
TextInput({ text: this.inputText, controller: this.controller })
.onFocus(() => {
this.controller.showSoftKeyboard()
})
}
// 添加整个Column的点击事件
.onClick(() => {
// 通过焦点系统获取当前焦点控件
let focusNode = focusControl.getCurrentFocus()
if (focusNode) {
focusNode.blur()
this.controller.hideSoftKeyboard()
}
})
}
方法2:使用焦点控制模块
import { focusControl } from '@ohos.arkui.focus'
// 在适当的位置添加焦点监听
focusControl.onFocusChange((oldNode, newNode) => {
if (!newNode) { // 当焦点变为空时隐藏键盘
this.controller.hideSoftKeyboard()
})
})
// 点击空白区域时主动清空焦点
Column()
.onClick(() => {
focusControl.clearFocus()
})
关键点说明:
focusControl
模块可以获取当前焦点状态blur()
方法或clearFocus()
可以主动取消焦点HitTestMode.Transparent
处理复杂布局的穿透点击扩展建议:
对于复杂页面可以使用自定义弹窗组件封装该逻辑:
@Component
struct AutoDismissKeyboard {
build() {
Column() {
// 内容区域
Column() {
// 这里放置表单内容...
}
.layoutWeight(1)
// 底部操作区域
Button('确认')
}
.width('100%')
.height('100%')
.onClick(() => {
focusControl.clearFocus()
})
.hitTestBehavior(HitTestMode.Transparent)
}
}
1 回答870 阅读✓ 已解决
1 回答1.2k 阅读
1 回答999 阅读
1 回答953 阅读
1 回答920 阅读
1 回答831 阅读
1 回答787 阅读
可以通过空白部分的点击事件,动态的修改TextInput的属性不可获焦,然后通过TextInput的点击事件设置可获焦。或者通过转移焦点到其他非关键组件上使当前TextInput失焦