HarmonyOS鸿蒙Next中怎么解决进入RichEditor组件页面无法自动拉起软键盘的问题

HarmonyOS鸿蒙Next中怎么解决进入RichEditor组件页面无法自动拉起软键盘的问题

【问题现象】

进入到某个含有RichEditor组件的页面,没有自动拉起软键盘,需要点击后才能拉起软键盘。

【背景知识】

RichEditor组件要拉起软键盘,需要主动获取当前页面焦点

【定位思路】

RichEditor组件无法拉起软键盘,说明当前页面焦点不在该组件上。因此需要确认当前页面焦点。

  1. 首先查看RichEditor组件有没有设置获取焦点。通过实现onFocus获焦监听事件,查看是否执行。
  2. 排查当前页面默认焦点是否冲突。需要排查当前页面布局下,其他组件(包括自定义组件)是否也获焦。
  3. 排查具体哪个组件获取了焦点。在所有获焦组件下实现onFocus获焦监听事件,查看最后具体哪个组件获得了当前页面焦点。

经过排查,发现是由于某个自定义组件中也设置了defaultFocus属性为true,导致RichEditor没有获取到焦点,无法拉起软键盘。

Column() {
  ...
  View(); // 内部设置了defaultFocus属性为true
  ...
  RichEditor({ controller: this.controller })
    .defaultFocus(true)
    .focusable(true)
    .onFocus(() => {
      console.info('RichEditor onfocus')
    })
  ...
}

【解决方案】

  1. 排查删除不必要的组件获焦。

  2. 设置RichEditor组件获焦,具体有如下两种方式:

    方式一:设置RichEditor组件的defaultFocus属性为true。

RichEditor({ controller: this.controller })
  .focusable(true)
  .defaultFocus(true)

方式二:通过requestFocus在页面展示或者组件挂载后获取焦点。

// 在页面展示获取焦点
build() {
  ...
  Column() {
    RichEditor({ controller: this.controller })
      .focusable(true)
      .key('editor')
  }
  ...
}

onPageShow():void { 
  focusControl.requestFocus('editor') // 页面展示时获取 
}
// 在组件挂载后获取焦点
RichEditor({ controller: this.controller })
  .key('editor')
  .focusable(true)
  .onAppear(() => {
    focusControl.requestFocus('editor') // 组件挂载时
  })

【总结】

  1. 复杂的页面需要仔细排查是否只有一个组件有默认焦点,避免冲突。
  2. 通过设置defaultFocus属性或者requestFocus都可以首次让RichRditor获取焦点拉起软键盘。requestFocus方式能动态控制获取焦点的组件,通过传入其他组件的Key值,能实现代码控制收起软键盘的效果。

更多关于HarmonyOS鸿蒙Next中怎么解决进入RichEditor组件页面无法自动拉起软键盘的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中怎么解决进入RichEditor组件页面无法自动拉起软键盘的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


RichEditor组件无法自动拉起软键盘的原因是页面焦点未正确设置。解决方法如下:

  1. 排查并删除不必要的组件获焦。
  2. 设置RichEditor组件获焦:
    • 方式一:设置RichEditor组件的defaultFocus属性为true
    • 方式二:通过requestFocus在页面展示或组件挂载后获取焦点。

示例代码:

// 方式一
RichEditor({ controller: this.controller })
  .focusable(true)
  .defaultFocus(true)

// 方式二
onPageShow():void {
  focusControl.requestFocus('editor') // 页面展示时获取
}

RichEditor({ controller: this.controller })
  .key('editor')
  .focusable(true)
  .onAppear(() => {
    focusControl.requestFocus('editor') // 组件挂载时
  })
回到顶部