HarmonyOS鸿蒙Next中TextInput组件弹出dialog后的软键盘隐藏问题

HarmonyOS鸿蒙Next中TextInput组件弹出dialog后的软键盘隐藏问题

使用TextInput组件,获取焦点后,弹出了软键盘,这时页面上再弹出一个dialog,软件盘会隐藏,如何弹出dialog不隐藏软键盘呢?

5 回复

可以自定义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默认会获取焦点并中断当前输入状态。

解决方法:

  1. 使用自定义Dialog,设置setFocusable(false)来防止Dialog获取焦点:

    CustomDialog dialog = new CustomDialog(context);
    dialog.setFocusable(false);
    
  2. 在Dialog显示后手动恢复软键盘:

    dialog.setOnShowListener(d -> {
        TextInput textInput = findComponentById(ComponentId);
        textInput.requestFocus();
    });
    
  3. 或者使用WindowManager调整软键盘策略:

    Window window = getWindow();
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    

注意:这些方法需要在Dialog显示逻辑中实现,确保软键盘保持可见状态。

回到顶部