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;
}
}
}
代码如下:
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;
}
}
}