HarmonyOS鸿蒙Next中TextInput组件弹出dialog后的软键盘隐藏问题
HarmonyOS鸿蒙Next中TextInput组件弹出dialog后的软键盘隐藏问题
使用TextInput组件,获取焦点后,弹出了软键盘,这时页面上再弹出一个dialog,软件盘会隐藏,如何弹出dialog不隐藏软键盘呢?
可以自定义Dialog的避让模式
// 设置Dialog避让模式为NONE
openCustomDialog({
keyboardAvoidMode: KeyboardAvoidMode.NONE, // 不自动避让软键盘
// 其他配置参数...
})
.then(...)
也可以用半模态转场sheetTransition与软键盘共存:
// 配置半模态弹窗
@CustomDialog
struct MyDialog {
build() {
Column() {
TextInput().focusable(true)
}
.sheetTransition() // 启用半模态转场
}
}
2楼的焦点转移也不错
更多关于HarmonyOS鸿蒙Next中TextInput组件弹出dialog后的软键盘隐藏问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
可以试试下面的办法,弹窗弹出的时候,让焦点转移至指定id的组件上
@Entry
@Component
struct Test {
build() {
Column() {
TextInput()
.id('disStockTextInput')
Button('模仿点击弹窗的操作').onClick(() => {
this.getUIContext().getFocusController().requestFocus('disStockTextInput')
})
}
}
}
可以使用失焦和主动获焦来控制键盘弹出,在弹出的diaolog以后,主动重新获取焦点。
支持焦点处理-添加交互响应-UI开发 (ArkTS声明式开发范式)-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者: 链接
层级页面/容器整体获焦时的焦点链
整体获焦与非整体获焦
-
整体获焦是层级页面/容器自身作为焦点链的叶节点获焦,获焦后再把焦点链叶节点转移到子孙组件。例如,层级页面切换、Navigation组件中的路由切换、焦点组走焦、容器组件主动调用requestFocusById等。
-
非整体获焦是某个组件作为焦点链叶节点获焦,导致其祖先节点跟着获焦。例如TextInput组件主动获取焦点、Tab键在非焦点组场景下走焦等。
在HarmonyOS Next中,当TextInput组件触发的Dialog弹出时,软键盘会自动隐藏。这是系统默认行为,因为Dialog通常需要全屏交互焦点。若需保持键盘显示,可在Dialog的onShow回调中手动调用TextInput的requestFocus方法。注意:此操作可能影响Dialog的交互体验,需谨慎使用。系统版本不同可能有差异,建议实测验证。
在HarmonyOS Next中,当TextInput获取焦点弹出软键盘后,如果显示Dialog会导致软键盘自动隐藏。这是因为Dialog默认会获取焦点并中断当前输入状态。
解决方法:
-
使用自定义Dialog,设置
setFocusable(false)
来防止Dialog获取焦点:CustomDialog dialog = new CustomDialog(context); dialog.setFocusable(false);
-
在Dialog显示后手动恢复软键盘:
dialog.setOnShowListener(d -> { TextInput textInput = findComponentById(ComponentId); textInput.requestFocus(); });
-
或者使用WindowManager调整软键盘策略:
Window window = getWindow(); window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
注意:这些方法需要在Dialog显示逻辑中实现,确保软键盘保持可见状态。