HarmonyOS鸿蒙Next中被动获焦场景下,怎么控制RichEditor不拉起软键盘

HarmonyOS鸿蒙Next中被动获焦场景下,怎么控制RichEditor不拉起软键盘

有一个UI

  1. 上方为 Text Text 有bindMenu, 长按会弹出 Menu
  2. 下方为RichEditor,点击输入会弹出键盘 ;

当 2 中处理输入态时、键盘处理弹出状态, 进行1长按弹出Menu,2中失焦、键盘消失。Menu点消失后,2又获焦键盘弹出, 怎样让键盘不要再弹出来了、RichEditor不再次获焦?

3 回复

上述场景中,点击RichEditor,组件获焦。长按Text出菜单,焦点转移到menu上,menu消失后,焦点返回到上一个获焦处,所以RichEditor会获焦并弹出键盘。

要避免默认的焦点转移的话,可以主动将焦点转移到一个不可见的位置,参考如下demo:

import web_webview from '@ohos.web.webview';

@Entry
@Component
struct Index {
  private iconStr: ResourceStr = $r("app.media.startIcon")
  controller: RichEditorController = new RichEditorController()
  webController: web_webview.WebviewController = new web_webview.WebviewController();

  @Builder
  MyMenu() {
    Menu() {
      MenuItem({ startIcon: this.iconStr, content: "菜单选项" })
      MenuItem({ startIcon: this.iconStr, content: "菜单选项" })
      MenuItem({ startIcon: this.iconStr, content: "菜单选项" })
    }
  }

  build() {
    Column({ space: 50 }) {
      Column() {
        Column() {
          Text('preview-image')
            .width(200)
            .height(100)
            .textAlign(TextAlign.Center)
            .margin(100)
            .fontSize(30)
            .bindContextMenu(this.MyMenu, ResponseType.LongPress,
              {
                preview: MenuPreviewMode.IMAGE,
                previewAnimationOptions: { scale: [0.8, 1.0] },
                onAppear: () => {
                  this.webController.requestFocus();
                }
              })
            .backgroundColor("#ff3df2f5")
          RichEditor({ controller: this.controller })
            .margin(10)
            .border({ width: 1 })
            .borderWidth(1)
            .borderColor(Color.Red)
            .width("100%")

          Web({ src: '', controller: this.webController })
            .width(0)
            .height(0)
        }
      }.width('100%')
    }
  }
}

更多关于HarmonyOS鸿蒙Next中被动获焦场景下,怎么控制RichEditor不拉起软键盘的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,若需在被动获焦场景下控制RichEditor不拉起软键盘,可通过设置focusablefocusableInTouchMode属性为false,或使用setFocusable(false)方法。此外,可在onFocusChange回调中判断获焦状态,手动调用InputMethodManagerhideSoftInputFromWindow方法隐藏软键盘。

在HarmonyOS Next中,可以通过以下方式控制RichEditor在被动获焦时不自动弹出软键盘:

  1. 使用onFocusChange监听焦点变化,在Menu弹出时主动阻止键盘弹出:
// 在RichEditor组件中添加焦点变化监听
RichEditor({
  onFocusChange: (isFocused: boolean) => {
    if (isMenuShowing) { // 判断Menu是否显示中
      // 主动失去焦点
      this.richEditorController.clearFocus();
    }
  }
)
  1. 在长按Menu弹出时,记录状态并控制RichEditor:
// 长按Text触发Menu时
onLongPress() {
  this.isMenuShowing = true;
  // 强制RichEditor失去焦点
  this.richEditorController.clearFocus();
}

// Menu关闭时
onMenuDismiss() {
  this.isMenuShowing = false;
  // 这里不再主动获取焦点,避免键盘弹出
}
  1. 或者使用disableSoftKeyboard属性直接禁用自动弹出:
RichEditor({
  disableSoftKeyboard: true // 禁用软键盘自动弹出
)

关键点在于通过状态管理控制焦点变化时机,在Menu显示期间阻止RichEditor重新获焦。可以根据实际场景选择最适合的方案。

回到顶部