HarmonyOS 鸿蒙Next 自定义键盘把光标跳动问题

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 自定义键盘把光标跳动问题

TextInput通过customKeyboard绑定自定义键盘时,当用户手动定位在文字中间位置再输入时,内容显示正确,但是光标总停留在最后。尝试在更新TextInput的value时,通过caretPosition动态设置,并未生效,需要把设置光标的动作延时。但这个延时时间不可控,再快速输入时会造成跳标。想请问下,如何以正确的方式解决这类问题。

可复现Demo:
2 回复

看一下这个参考:

光标的监听位置需要在TextInput的onchange事件中去感知光标的变化,然后调整光标位置

例如:

onChange() {
  this.controller.caretPosition(++this.ep)
}

@Entry
@Component
struct TextInputExample {
  controller: TextInputController = new TextInputController()
  @State inputValue: string = ""
  ep: number = 0;
  del:boolean = false;

  // 自定义键盘组件
  @Builder CustomKeyboardBuilder() {
    Column() {
      Button('x').onClick(() => {
        // 关闭自定义键盘
        this.controller.stopEditing()
      })
      Button('删除').onClick(() => {
        this.inputValue = this.inputValue.substring(0, this.ep-1) + this.inputValue.substring(this.ep)
        this.del = true
      })
      Grid() {
        ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, '*', 0, '#'], (item: number | string) => {
          GridItem() {
            Button(item + "").width(110).onClick(() => {
              this.inputValue = this.inputValue.substring(0, this.ep) + item + this.inputValue.substring(this.ep)
              this.del = false
            })
          }
        })
      .maxCount(3).columnsGap(10).rowsGap(10).padding(5)
    }.backgroundColor(Color.Gray)
  }

  build() {
    Column() {
      TextInput({ controller: this.controller, text: this.inputValue })
        // 绑定自定义键盘
        .customKeyboard(this.CustomKeyboardBuilder())
        .margin(10)
        .border({ width: 1 })
        //感知光标的变化,然后调整光标位置
        .onChange(() => {
          if(this.del){
            this.controller.caretPosition(--this.ep)
          }else{
            this.controller.caretPosition(++this.ep)
          }
        })
        .onTextSelectionChange((ss) => {
          this.ep = ss;
        })
    }
  }
}

更多关于HarmonyOS 鸿蒙Next 自定义键盘把光标跳动问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next系统中自定义键盘出现的光标跳动问题,这通常与键盘输入事件的处理、UI刷新机制或系统资源调度有关。以下是一些可能的原因及解决方法概述,但严格遵循您的要求,不涉及Java或C语言相关内容:

  1. 事件处理延迟:检查键盘输入事件的处理逻辑,确保没有不必要的阻塞操作,如复杂计算或大量数据处理,这些都可能导致UI更新延迟,进而表现为光标跳动。

  2. UI刷新机制:优化键盘UI的刷新机制,确保在输入事件触发时,UI能够即时且平滑地更新。可以考虑使用更高效的渲染技术或减少不必要的重绘。

  3. 系统资源调度:确认系统资源是否充足,包括CPU和内存。资源紧张时,系统可能无法及时响应UI更新请求,导致光标跳动。尝试在资源较为充裕的环境下运行键盘应用,观察问题是否依旧存在。

  4. 版本兼容性:检查当前使用的HarmonyOS版本是否已知存在此类问题。如果是,关注华为官方发布的更新或补丁,及时升级系统可能解决问题。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部