鸿蒙NEXT开发键盘工具类(ArkTs)

复制代码
export declare type KeyboardCallBack = (show: boolean, height: number) => void;
import { AppUtil } from './AppUtil';
import { LogUtil } from './LogUtil';
import { ArrayUtil } from './ArrayUtil';

/**
 * 键盘工具类
 * @author 鸿蒙布道师
 * @since 2025/04/18
 */
export class KeyboardUtil {
  private static callBacks: KeyboardCallBack[] = []; // 缓存的监听回调
  private static keyboardCallBack: ((height: number) => void) | undefined; // 全局键盘监听回调

  /**
   * 拉起键盘
   * @param key 输入框类组件的key或id
   * @param uiContext 页面的UIContext(子窗口需传入,主窗口可省略)
   */
  static show(key: string, uiContext?: UIContext): void {
    (uiContext ?? AppUtil.getUIContext()).getFocusController().requestFocus(key);
  }

  /**
   * 关闭键盘
   * @param uiContext 页面的UIContext(子窗口需传入,主窗口可省略)
   */
  static hide(uiContext?: UIContext): void {
    (uiContext ?? AppUtil.getUIContext()).getFocusController().clearFocus();
  }

  /**
   * 订阅输入法软键盘显示或隐藏事件
   * @param callback 回调函数:
   *         - show: boolean,true表示键盘显示,false表示键盘隐藏;
   *         - height: number,键盘高度。
   */
  static onKeyboardListener(callback: KeyboardCallBack): void {
    if (ArrayUtil.contain(KeyboardUtil.callBacks, callback)) {
      LogUtil.error(`KeyboardUtil-onKeyboardListener: 监听事件已存在!`);
      return;
    }

    KeyboardUtil.callBacks.push(callback);

    if (!KeyboardUtil.keyboardCallBack) {
      KeyboardUtil.keyboardCallBack = (height: number) => {
        KeyboardUtil.callBacks.forEach(cb => cb?.(height > 0, height));
      };
      AppUtil.getMainWindow().on('keyboardHeightChange', KeyboardUtil.keyboardCallBack);
    }
  }

  /**
   * 取消订阅输入法软键盘显示或隐藏事件
   * @param callback 要移除的监听事件,若不传则移除所有监听事件
   */
  static removeKeyboardListener(callback?: KeyboardCallBack): void {
    if (callback) {
      ArrayUtil.remove(KeyboardUtil.callBacks, callback);
    } else {
      KeyboardUtil.callBacks = [];
    }

    if (KeyboardUtil.keyboardCallBack && KeyboardUtil.callBacks.length === 0) {
      AppUtil.getMainWindow().off('keyboardHeightChange', KeyboardUtil.keyboardCallBack);
      KeyboardUtil.keyboardCallBack = undefined;
    }
  }
}

代码如下:
TypeScript 复制代码
export declare type KeyboardCallBack = (show: boolean, height: number) => void;
import { AppUtil } from './AppUtil';
import { LogUtil } from './LogUtil';
import { ArrayUtil } from './ArrayUtil';

/**
 * 键盘工具类
 * @author 鸿蒙布道师
 * @since 2025/04/18
 */
export class KeyboardUtil {
  private static callBacks: KeyboardCallBack[] = []; // 缓存的监听回调
  private static keyboardCallBack: ((height: number) => void) | undefined; // 全局键盘监听回调

  /**
   * 拉起键盘
   * @param key 输入框类组件的key或id
   * @param uiContext 页面的UIContext(子窗口需传入,主窗口可省略)
   */
  static show(key: string, uiContext?: UIContext): void {
    (uiContext ?? AppUtil.getUIContext()).getFocusController().requestFocus(key);
  }

  /**
   * 关闭键盘
   * @param uiContext 页面的UIContext(子窗口需传入,主窗口可省略)
   */
  static hide(uiContext?: UIContext): void {
    (uiContext ?? AppUtil.getUIContext()).getFocusController().clearFocus();
  }

  /**
   * 订阅输入法软键盘显示或隐藏事件
   * @param callback 回调函数:
   *         - show: boolean,true表示键盘显示,false表示键盘隐藏;
   *         - height: number,键盘高度。
   */
  static onKeyboardListener(callback: KeyboardCallBack): void {
    if (ArrayUtil.contain(KeyboardUtil.callBacks, callback)) {
      LogUtil.error(`KeyboardUtil-onKeyboardListener: 监听事件已存在!`);
      return;
    }

    KeyboardUtil.callBacks.push(callback);

    if (!KeyboardUtil.keyboardCallBack) {
      KeyboardUtil.keyboardCallBack = (height: number) => {
        KeyboardUtil.callBacks.forEach(cb => cb?.(height > 0, height));
      };
      AppUtil.getMainWindow().on('keyboardHeightChange', KeyboardUtil.keyboardCallBack);
    }
  }

  /**
   * 取消订阅输入法软键盘显示或隐藏事件
   * @param callback 要移除的监听事件,若不传则移除所有监听事件
   */
  static removeKeyboardListener(callback?: KeyboardCallBack): void {
    if (callback) {
      ArrayUtil.remove(KeyboardUtil.callBacks, callback);
    } else {
      KeyboardUtil.callBacks = [];
    }

    if (KeyboardUtil.keyboardCallBack && KeyboardUtil.callBacks.length === 0) {
      AppUtil.getMainWindow().off('keyboardHeightChange', KeyboardUtil.keyboardCallBack);
      KeyboardUtil.keyboardCallBack = undefined;
    }
  }
}
相关推荐
行者961 小时前
OpenHarmony上Flutter粒子效果组件的深度适配与实践
flutter·交互·harmonyos·鸿蒙
城东米粉儿1 小时前
compose 状态提升 笔记
android
冰淇淋真好吃1 小时前
iOS实现 WKWebView 长截图的优雅方案
ios
小溪彼岸1 小时前
uni-app小白从0开发一款鸿蒙Next应用到上线
uni-app·harmonyos
asing1 小时前
🤯 为什么我的收银台在鸿蒙系统“第一次返回”死活拦不住?一次差点背锅的排查实录
前端·harmonyos
汤愈韬1 小时前
双向NAT
网络·网络协议·网络安全·security·huawei
粤M温同学1 小时前
Android 实现沉浸式状态栏
android
ljt27249606612 小时前
Compose笔记(六十八)--MutableStateFlow
android·笔记·android jetpack
Van_captain2 小时前
rn_for_openharmony常用组件_Breadcrumb面包屑
javascript·开源·harmonyos