From df4c6a63e8d448cdf0d15f170ee14fd87ebdfe44 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 22 Feb 2026 15:58:59 +0800 Subject: [PATCH] :art: Improve keyboard pop on HarmonyOS (Pura X) Signed-off-by: Daniel <845765@qq.com> --- app/src/mobile/util/keyboardToolbar.ts | 8 +++++++- app/src/mobile/util/mobileAppUtil.ts | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/mobile/util/keyboardToolbar.ts b/app/src/mobile/util/keyboardToolbar.ts index c4e48c8da..f4c020e8a 100644 --- a/app/src/mobile/util/keyboardToolbar.ts +++ b/app/src/mobile/util/keyboardToolbar.ts @@ -14,7 +14,7 @@ import {hideElements} from "../../protyle/ui/hideElements"; import {softEnter} from "../../protyle/wysiwyg/enter"; import {isInAndroid, isInEdge, isInHarmony} from "../../protyle/util/compatibility"; import {tabCodeBlock} from "../../protyle/wysiwyg/codeBlock"; -import {callMobileAppShowKeyboard, canInput} from "./mobileAppUtil"; +import {callMobileAppShowKeyboard, canInput, keyboardLockUntil} from "./mobileAppUtil"; let renderKeyboardToolbarTimeout: number; let showUtil = false; @@ -471,6 +471,12 @@ export const hideKeyboardToolbar = () => { }; export const activeBlur = () => { + const now = Date.now(); + if (now < keyboardLockUntil) { + console.warn(`activeBlur blocked by lock (remaining: ${keyboardLockUntil - now}ms)`); + return; + } + if (window.JSAndroid && window.JSAndroid.hideKeyboard) { window.JSAndroid.hideKeyboard(); } else if (window.JSHarmony && window.JSHarmony.hideKeyboard) { diff --git a/app/src/mobile/util/mobileAppUtil.ts b/app/src/mobile/util/mobileAppUtil.ts index ed6557920..0f6494457 100644 --- a/app/src/mobile/util/mobileAppUtil.ts +++ b/app/src/mobile/util/mobileAppUtil.ts @@ -1,6 +1,12 @@ import {hasClosestByAttribute, hasClosestByClassName} from "../../protyle/util/hasClosest"; +export let keyboardLockUntil = 0; + export const callMobileAppShowKeyboard = () => { + // 某些机型(比如鸿蒙 Pura X)在弹起键盘后会立即触发 activeBlur 导致键盘被关闭,所以在主动唤起键盘时锁定一段时间,禁止 activeBlur 关闭键盘 + // 每次主动唤起键盘时,锁定接下来的 300ms 不允许通过 activeBlur 关闭 + keyboardLockUntil = Date.now() + 200; + if (window.JSAndroid && window.JSAndroid.showKeyboard) { window.JSAndroid.showKeyboard(); } else if (window.JSHarmony && window.JSHarmony.showKeyboard) {