HarmonyOS鸿蒙Next中如何实现软件盘收起的时候textInput聚焦状态不会改变

HarmonyOS鸿蒙Next中如何实现软件盘收起的时候textInput聚焦状态不会改变 现在的情况时,点击软件盘的收起按钮时textinput自动失去焦点。

8 回复

API 11 及之后版本,软键盘的收起按钮会默认触发 TextInput 失去焦点。若需保留焦点,需要通过焦点控制事件手动管理状态:

@State isFocused: boolean = false

TextInput()
  .onFocus(() => {
    this.isFocused = true
  })
  .onBlur(() => {
    if (this.isFocused) {
      // 若需强制保持焦点
      setTimeout(() => {
        this.textInputController.requestFocus() // 重新请求焦点
      }, 10)
    }
  })
  .controller(this.textInputController)

更多关于HarmonyOS鸿蒙Next中如何实现软件盘收起的时候textInput聚焦状态不会改变的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


import { inputMethod } from '@kit.IMEKit';

inputMethod.getController().stopInputSession()

试试这个 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inputmethod

收到。 这个试啦,达不到效果。想要的效果是软件盘收起,textinput的聚焦状态不变(还是聚焦),还试了一种方法,监听软件盘高度,然后给text input标签设置聚焦,但是他俩好像绑定着呢,一设置聚焦,软件盘又弹出来了。而且我在纯血鸿蒙的app上找了一下。没有找到有这种功能实现的。不过还是谢谢你给的方案。

主动获焦/失焦

  • 使用FocusController中的方法 使用FocusController中的requestFocus主动获取焦点。优势如下:
    • 当前帧生效,避免被下一帧组件树变化影响。
    • 有异常值返回,便于排查主动获取焦点失败的原因。
    • 避免多实例场景中取到错误实例。 需先使用UIContext中的getFocusController()方法获取实例,再通过此实例调用对应方法。
    1. requestFocus(key: string): void 通过组件的id将焦点转移到组件树对应的实体节点,生效时间为当帧生效。
    2. clearFocus(): void 清除焦点,将焦点强制转移到层级页面根容器节点,焦点链路上其他节点失焦。
  • 使用focusControl中的方法
    1. requestFocus(value: string): boolean

找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

它们两个好像是绑定着呢,一设置聚焦软件盘就会弹起来。而且我在纯血鸿蒙app上目前没有看到有实现这个功能的。

在HarmonyOS Next中,可通过在TextInput组件上设置enableKeyboardOnFocus属性为false来保持聚焦状态。当软键盘收起时,TextInput不会失去焦点,确保输入状态不变。

在HarmonyOS Next中,当软键盘收起时,默认行为确实会导致当前获得焦点的TextInput组件失去焦点。要维持其聚焦状态,核心思路是拦截或重写默认的失焦逻辑。

一个直接有效的方法是通过onBlur事件和状态管理进行控制。你可以在TextInputonBlur回调中,判断失焦原因是否来自软键盘收起(通常可通过检查全局标志或结合页面布局变化判断),如果是,则通过状态变量强制让组件重新请求焦点。

示例代码如下(使用ArkTS):

import { textInputFocusController, FocusState } from '@ohos.arkui.advanced';

@Entry
@Component
struct Index {
  @State isInputFocused: boolean = true; // 控制焦点状态
  private aboutToHideKeyboard: boolean = false; // 用于标记软键盘即将收起

  aboutToAppear() {
    // 监听软键盘事件(此处为示意,具体事件名需参考最新API文档)
    // keyboardController.onHide(() => {
    //   this.aboutToHideKeyboard = true;
    // });
  }

  build() {
    Column() {
      TextInput()
        .focus(this.isInputFocused) // 绑定焦点状态
        .onBlur(() => {
          // 如果失焦是由于软键盘收起触发,则重新聚焦
          if (this.aboutToHideKeyboard) {
            this.isInputFocused = true;
            this.aboutToHideKeyboard = false; // 重置标记
          }
        })
        .onFocus(() => {
          this.aboutToHideKeyboard = false; // 获得焦点时重置标记
        })
    }
  }
}

关键点:

  1. 监听键盘收起:需要监听软键盘的隐藏事件(例如通过keyboardController相关API),并在回调中设置一个标记(如aboutToHideKeyboard)。
  2. 控制onBlur:在TextInputonBlur回调中,检查该标记。如果为true,则通过改变状态变量(isInputFocused)强制组件重新获得焦点。
  3. 重置状态:在onFocus或合适的时机重置标记,避免逻辑干扰。

注意事项:

  • 实际开发中需要查阅HarmonyOS Next最新的键盘控制焦点控制API,以获取准确的监听方式。
  • 此方法会覆盖默认的收起键盘行为,请确保其符合你的交互设计,避免与其他焦点逻辑冲突。

通过主动管理焦点状态,即可实现软键盘收起时TextInput保持聚焦。

回到顶部