鸿蒙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;
    }
  }
}
相关推荐
NoSi EFUL8 小时前
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
android·数据库·mysql
jiejiejiejie_9 小时前
Flutter 三方库 pull_to_refresh 的鸿蒙化适配指南
flutter·华为·harmonyos
安小牛10 小时前
Android 开发汉字转带声调的拼音
android·java·学习·android studio
聚美智数10 小时前
企业实际控制人查询-公司实控人查询
android·java·javascript
JMchen12311 小时前
第 3 篇|Android 项目结构解析与第一个界面 —— Hello, CSDN!
android·android studio·android 零基础·android 项目结构·android 界面开发
for_ever_love__14 小时前
UI学习:多界面传值的正向传值(属性传值)和反向传值(代理传值)
学习·ui·ios·objective-c
众少成多积小致巨14 小时前
Soong构建入门
android·go·编译器
笔夏14 小时前
【安卓学习之混淆】记录一些混淆导致闪退
android·学习
阿巴斯甜14 小时前
Kotlin高阶函数和Java 8 lambda的区别:
android
前端技术15 小时前
通信网络基础(下篇):TCP/IP网络参考模型与传输层协议深度解析
华为