鸿蒙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;
    }
  }
}
相关推荐
BoomHe9 小时前
Now in Android 架构模式全面分析
android·android jetpack
Hcourage10 小时前
鸿蒙工程获取C/C++代码覆盖
harmonyos
ssshooter12 小时前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
二流小码农16 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少16 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker17 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋17 小时前
Android 协程时代,Handler 应该退休了吗?
android
万少1 天前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
火柴就是我1 天前
让我们实现一个更好看的内部阴影按钮
android·flutter
开心就好20251 天前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios