HarmonyOS鸿蒙Next应用输入框焦点控制实现键盘显隐和进入页面默认弹出键盘获取焦点设置

HarmonyOS鸿蒙Next应用输入框焦点控制实现键盘显隐和进入页面默认弹出键盘获取焦点设置

鸿蒙应用输入框焦点控制实现键盘显隐和进入页面默认弹出键盘获取焦点设置

3 回复

一、结论

鸿蒙中输入框控件,TextInput最常见的控制,即:针对输入框焦点控制,获取焦点,失去焦点。达到用户方便操作输入和退出输入。

因为输入框一定会伴随着键盘交互,一般在逻辑控制上和UI渲染上,都可能会需要动态调整改焦点

另外一个比较常用的需求是,进入页面,键盘就自动弹出,输入框默认获取焦点

二、代码实现和详细解释

问题一:

1.首先调用此接口可以主动让焦点转移至参数指定的组件上:

focusControl.requestFocus(“id”);


注意:
1.支持焦点控制的组件:TextInput、TextArea、Search、Button、Text、Image、List、Grid。焦点事件当前仅支持在真机上显示运行效果。


2.监听监控自身的获取焦点回调和失去焦点回调:
onFocus
onBlur

3.点击控件时需要设置控件获取焦点

问题二:
1.进入页面,键盘就自动弹出,需要在输入框控件上设置 defaultFocu(true)


注意:
defaultFocus对于自定义view不生效【Set default focused component when a page create.】


DEMO示例:

import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

/**
 * 焦点界面
 */
@Entry
@Component
struct FocusPage {

  private TAG: string = "FocusPage";

  private ID_TARGET_TEXT_INPUT: string = "ID_TARGET_TEXT_INPUT";

  // 是否能获焦,默认false
  @State isFocusable: boolean = true;

  private requestFocus(){
    focusControl.requestFocus(this.ID_TARGET_TEXT_INPUT);
  }

  private setFocus(){
    this.isFocusable = true;
    this.requestFocus();
  }

  onClickSetFocus = ()=>{
    this.setFocus();
  }

  onClickResetFocus = ()=>{
    // 禁用焦点,就可直接失去焦点
    this.isFocusable = false;
  }

  private showToast(content: string){
    try {
      promptAction.showToast({
        message: content,
        duration: 2000
      });
    } catch (error) {
      let message = (error as BusinessError).message
      let code = (error as BusinessError).code
      console.error(this.TAG, `showToast args error code is ${code}, message is ${message}`);
    };
  }

  build() {
    Column(){
      TextInput()
        .id(this.ID_TARGET_TEXT_INPUT)
        .size({
          width: px2vp(600),
          height: px2vp(200)
        })
        .defaultFocus(true) // 设置默认焦点为true,进入页面就会获取焦点,弹出键盘
        .focusable(this.isFocusable)
        // 获得焦点回调
        .onFocus(()=>{
          // do sth ..
          this.showToast("onFocus 获得焦点回调");
        })
        // 失去焦点回调
        .onBlur(()=>{
          // do sth ..
          this.showToast("onBlur 失去焦点回调");
        })
        .onClick(()=>{
          this.setFocus();
        })

      Row(){
        Button("click set focus")
          .size({
            width: px2vp(600),
            height: px2vp(200)
          })
          .margin({ top: px2vp(100) })
          .onClick(this.onClickSetFocus)

        Blank()

        Button("click reset focus")
          .size({
            width: px2vp(600),
            height: px2vp(200)
          })
          .margin({ top: px2vp(100) })
          .onClick(this.onClickResetFocus)
      }
      .size({
        width: "100%",
        height: px2vp(200),
      })
      .padding({ left: px2vp(20), right: px2vp(20) })
    }
    .justifyContent(FlexAlign.Center)
    .size({
      width: "100%",
      height: "100%"
    })
  }
}

更多关于HarmonyOS鸿蒙Next应用输入框焦点控制实现键盘显隐和进入页面默认弹出键盘获取焦点设置的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,通过TextInput组件的focusableonEditChange控制焦点。设置focusable(true)使输入框可获焦,结合onEditChange监听焦点状态变化以显隐键盘。进入页面默认弹出键盘需在aboutToAppear生命周期调用输入框的requestFocus方法自动获取焦点并触发键盘显示。

在HarmonyOS Next中,输入框焦点控制和键盘显隐管理主要通过TextInput组件和相关焦点控制器实现。

1. 键盘显隐控制

  • 使用focusControl获取焦点控制器。
  • 显示键盘:通过focusControl.requestFocus(inputFocusNode)请求输入框焦点。
  • 隐藏键盘:通过focusControl.defaultFocus()focusControl.clearFocus()使输入框失去焦点。

2. 页面进入默认弹出键盘

  • aboutToAppear生命周期中,使用setTimeout延迟调用focusControl.requestFocus
  • 延迟时间建议设为0,确保组件渲染完成后再请求焦点。

示例代码:

import { focusControl } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  @State inputText: string = '';
  @Link inputFocusNode: FocusNode;

  aboutToAppear() {
    // 页面进入时自动弹出键盘
    setTimeout(() => {
      focusControl.requestFocus(this.inputFocusNode);
    }, 0);
  }

  build() {
    Column() {
      TextInput({ text: this.inputText })
        .focusNode(this.inputFocusNode)
        .onChange((value: string) => {
          this.inputText = value;
        })

      Button('隐藏键盘')
        .onClick(() => {
          focusControl.clearFocus();
        })
    }
  }
}

关键点:

  • 使用FocusNode关联TextInput组件。
  • 页面初始化时在aboutToAppear中请求焦点。
  • 通过焦点控制器统一管理键盘显隐。

这种方式能有效控制输入框焦点状态和键盘行为,适用于需要自动弹出键盘或程序化控制键盘的场景。

回到顶部