HarmonyOS 鸿蒙Next中focusControl.requestFocus切换输入框焦点时,如何才能使键盘一直显示状态,而不是先隐藏再弹出?

HarmonyOS 鸿蒙Next中focusControl.requestFocus切换输入框焦点时,如何才能使键盘一直显示状态,而不是先隐藏再弹出?

有多个TextInput输入框,弹出我的自定义键盘,自定义键盘上有一个“下一项”的按键,执行focusControl.requestFocus操作,但每次切换都是先隐藏键盘再弹出,如何实现键盘一直弹出状态,仅切换焦点?

操作如下:

Text('下一项')
  .height('100%')
  .textAlign(TextAlign.Center)
  .layoutWeight(1)
  .fontSize(20)
  .fontColor(Color.White)
  .borderRadius(4)
  .backgroundColor($r('app.color.primary_color'))
  .onClick(() => {
    if (this.index >= this.varNameList.length - 1) {
      this.index = -1;
    }
    focusControl.requestFocus(this.varNameList[++this.index]);
  })

更多关于HarmonyOS 鸿蒙Next中focusControl.requestFocus切换输入框焦点时,如何才能使键盘一直显示状态,而不是先隐藏再弹出?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

你问我答#

可以通过focusControl.requestFocus控制。文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-focus-V5 #focuscontrol9

跳转页面:

@Entry
@Component
struct SearchPage {
aboutToAppear(): void {
setTimeout(() => {
focusControl.requestFocus(‘AAA’)
}, 1000)
}

build() {
Row() {
Column() {
TextInput().enableKeyboardOnFocus(true).key(‘AAA’)
}
}
.width(‘100%’)
}
.height(‘100%’)
}

注意获取焦点的事件要在页面TextInput渲染完成后调用。当前没有build后的直接回调,可以通过setTimeout异步或注册渲染监听事件判断。

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-arkui-uicontext-V5 #createcomponentobserver

更多关于HarmonyOS 鸿蒙Next中focusControl.requestFocus切换输入框焦点时,如何才能使键盘一直显示状态,而不是先隐藏再弹出?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好!

了解到 输入框切换时,自定义键盘会收起再弹出,自定义键盘没有焦点续接,无法实现第二次触发时键盘不从下往上弹出,暂不支持;

您可以使用系统键盘吗?

我这边写了个demo,

1. 可以实现使用系统键盘更改右下角按键样式

.enterKeyType:[https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-types-V13#enterkeytype](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-types-V13#enterkeytype) 枚举说明

2. 在.onSubmit时,做保持编辑状态不让键盘下移

event.keepEditableState():[https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-basic-components-textinput-V13#keepeditablestate](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-basic-components-textinput-V13#keepeditablestate)

3. 移动焦点

focusControl.requestFocus:[https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-universal-attributes-focus-V13#requestfocus9](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-universal-attributes-focus-V13#requestfocus9)

demo如下:

```javascript
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index5701_2 {
  private varNameList: string[] = ['1','2','3','4','5'];
  private index: number = 0;
  build() {
    Column(){
      TextInput()
        .id(this.varNameList[0])
        .backgroundColor(Color.Gray)
        .enterKeyType(EnterKeyType.Next)
        .onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => {
          // 调用keepEditableState方法,输入框保持编辑态
          event.keepEditableState()
          focusControl.requestFocus(this.varNameList[++this.index%5])
        })
      TextInput()
        .id(this.varNameList[1])
        .backgroundColor(Color.Gray)
        .enterKeyType(EnterKeyType.Next)
        .onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => {
          // 调用keepEditableState方法,输入框保持编辑态
          event.keepEditableState()
          focusControl.requestFocus(this.varNameList[++this.index%5])
        })
      TextInput()
        .id(this.varNameList[2])
        .backgroundColor(Color.Gray)
        .enterKeyType(EnterKeyType.Next)
        .onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => {
          // 调用keepEditableState方法,输入框保持编辑态
          event.keepEditableState()
          focusControl.requestFocus(this.varNameList[++this.index%5])
        })
      TextInput()
        .id(this.varNameList[3])
        .backgroundColor(Color.Gray)
        .enterKeyType(EnterKeyType.Next)
        .onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => {
          // 调用keepEditableState方法,输入框保持编辑态
          event.keepEditableState()
          focusControl.requestFocus(this.varNameList[++this.index%5])
        })
      TextInput()
        .id(this.varNameList[4])
        .backgroundColor(Color.Gray)
        .enterKeyType(EnterKeyType.Next)
        .onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => {
          // 调用keepEditableState方法,输入框保持编辑态
          event.keepEditableState()
          focusControl.requestFocus(this.varNameList[++this.index%5])
        })
    }
    .justifyContent(FlexAlign.Center)
    .width('100%')
  }
}

您好!

您的问题已收到,我这边写个demo试下!

想问问题解决了吗,我也遇到了这个问题,

您好!楼下有demo!看下是否能解决您的问题,

在HarmonyOS鸿蒙Next中,使用focusControl.requestFocus切换输入框焦点时,若要保持键盘一直显示状态,可以通过以下方式实现:

  1. 确保输入框的焦点切换流畅:在调用focusControl.requestFocus之前,确保当前输入框的焦点已经被释放,避免因焦点冲突导致键盘隐藏。

  2. 使用InputMethodController保持键盘显示:通过InputMethodController来控制键盘的显示状态。在切换焦点时,调用InputMethodControllershowInputMethod方法,确保键盘不会隐藏。

  3. 避免焦点切换时的延迟:在切换焦点时,确保操作迅速,避免因延迟导致键盘隐藏。可以通过优化代码逻辑,减少不必要的操作。

  4. 监听焦点变化:通过监听输入框的焦点变化事件,在焦点切换时立即调用InputMethodControllershowInputMethod方法,保持键盘显示。

  5. 使用InputMethodManager保持键盘状态:通过InputMethodManagerrestartInput方法,在焦点切换时重新启动输入法,确保键盘不会隐藏。

通过以上方法,可以在切换输入框焦点时保持键盘一直显示状态,避免键盘先隐藏再弹出的问题。

在HarmonyOS鸿蒙Next中,使用focusControl.requestFocus切换输入框焦点时,键盘会默认先隐藏再弹出。为了保持键盘一直显示,可以通过以下步骤实现:

  1. 确保输入框的焦点状态:在切换焦点前,确保当前输入框已经获取焦点并显示键盘。
  2. 使用requestFocus方法:调用focusControl.requestFocus切换焦点到目标输入框。
  3. 保持键盘显示:在切换焦点后,立即调用inputMethodManager.showSoftInput方法强制显示键盘。

示例代码:

focusControl.requestFocus(targetInput);
inputMethodManager.showSoftInput(targetInput, InputMethodManager.SHOW_FORCED);

这样可以避免键盘先隐藏再弹出的问题,保持键盘的持续显示。

回到顶部