Delphi安卓手势导航下VirtualKeyboard事件触发异常求助
Delphi Android手势导航下硬件返回手势控制虚拟键盘事件触发异常问题
问题描述
在Delphi应用中使用Android手势导航时,执行硬件返回(HwBack)手势隐藏/显示虚拟键盘,事件仅每两次尝试才触发一次,但3键导航系统下无此问题。
复现步骤
- 在Delphi中创建TForm;
- 添加可触发虚拟键盘的组件(如TEdit);
- 切换至Android手势导航模式,通过HwBack手势尝试隐藏键盘;
- 观察到虚拟键盘的隐藏事件仅每两次操作触发一次。
补充说明
- 3键导航系统下事件触发完全正常;
- 该问题已提交至Embarcadero,对应问题报告编号为RSP-2040、RSP-2047;
- 问题出在安装了最新补丁的Delphi 12.2中,推测支持Android 10的旧版本也存在此问题;
- 额外细节:使用边缘返回手势和键盘下方的隐藏按钮表现有差异,后者可稳定复现问题。
已知情况与临时解决方法
- 手动拦截返回事件控制键盘
重写Delphi的OnBackKeyPress事件,主动处理虚拟键盘的显示/隐藏逻辑,绕过系统默认的事件传递:
procedure TForm1.FormBackKeyPress(Sender: TObject; var Handled: Boolean); begin if VirtualKeyboard.Visible then begin VirtualKeyboard.Hide; Handled := True; // 标记事件已处理,避免系统重复响应 end; end;
- 通过原生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;
在需要的逻辑中调用此函数,手动控制键盘状态,不受系统手势事件干扰。
- 等待官方修复
由于该问题已被纳入官方BUG跟踪系统(RSP-2040、RSP-2047),可关注Embarcadero后续发布的补丁或版本更新,官方修复会是最彻底的解决方案。
内容的提问来源于stack exchange,提问作者fisi-pjm
相关产品推荐
相关产品推荐

