You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi安卓手势导航下VirtualKeyboard事件触发异常求助

Delphi Android手势导航下硬件返回手势控制虚拟键盘事件触发异常问题

问题描述

在Delphi应用中使用Android手势导航时,执行硬件返回(HwBack)手势隐藏/显示虚拟键盘,事件仅每两次尝试才触发一次,但3键导航系统下无此问题。

复现步骤

  • 在Delphi中创建TForm;
  • 添加可触发虚拟键盘的组件(如TEdit);
  • 切换至Android手势导航模式,通过HwBack手势尝试隐藏键盘;
  • 观察到虚拟键盘的隐藏事件仅每两次操作触发一次。

补充说明

  • 3键导航系统下事件触发完全正常;
  • 该问题已提交至Embarcadero,对应问题报告编号为RSP-2040、RSP-2047;
  • 问题出在安装了最新补丁的Delphi 12.2中,推测支持Android 10的旧版本也存在此问题;
  • 额外细节:使用边缘返回手势和键盘下方的隐藏按钮表现有差异,后者可稳定复现问题。

已知情况与临时解决方法

  1. 手动拦截返回事件控制键盘
    重写Delphi的OnBackKeyPress事件,主动处理虚拟键盘的显示/隐藏逻辑,绕过系统默认的事件传递:
procedure TForm1.FormBackKeyPress(Sender: TObject; var Handled: Boolean);
begin
  if VirtualKeyboard.Visible then
  begin
    VirtualKeyboard.Hide;
    Handled := True; // 标记事件已处理,避免系统重复响应
  end;
end;
  1. 通过原生API判断键盘状态
    调用Android原生API直接监听键盘状态,替代Delphi自带的VirtualKeyboard事件,避免手势导航下的事件丢失:
function GetKeyboardVisible: Boolean;
var
  InputMethodManager: JInputMethodManager;
  Window: JWindow;
  Rect: JRect;
begin
  InputMethodManager := TJInputMethodManager.Wrap(
    TAndroidHelper.Context.getSystemService(TJContext.JavaClass.INPUT_METHOD_SERVICE));
  Window := TAndroidHelper.Activity.getWindow;
  Rect := TJRect.JavaClass.init;
  Window.getDecorView.getWindowVisibleDisplayFrame(Rect);
  // 通过屏幕可见区域高度差判断键盘是否显示(阈值可根据需求调整)
  Result := (Window.getDecorView.getHeight - Rect.bottom) > 200;
end;

在需要的逻辑中调用此函数,手动控制键盘状态,不受系统手势事件干扰。

  1. 等待官方修复
    由于该问题已被纳入官方BUG跟踪系统(RSP-2040、RSP-2047),可关注Embarcadero后续发布的补丁或版本更新,官方修复会是最彻底的解决方案。

内容的提问来源于stack exchange,提问作者fisi-pjm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:34:55