首页 > 解决方案 > Firemonkey:当 VKAutoShowMode 为 Never 时弹出软键盘

问题描述

我有一个大型 firemonkey android 应用程序,它主要用于条码扫描仪设备,但也必须可用于例如 android 手机(用于测试)。当在通常具有物理键盘的条形码扫描仪设备上使用时,我们通过将 VKAutoShowMode 设置为 TVKAutoShowMode.Never 来抑制虚拟键盘。

这适用于大多数 Tedit 组件。但是,对于其中的 1 或 2 个 - 就所有意图和目的而言,它们与其他“相同” - 当从物理键盘接收到按键时,虚拟键盘会弹出。此外,通过在相关 Tedit 上设置 KillFocusByReturn 使用返回键不容易消除它。

我可以使用 Android 语言和输入设置来解决这个问题,以有效地完全禁用虚拟键盘,但这并不理想,因为在某些领域我们确实希望软键盘用于更简单的 alpha 输入。

我还可以通过在问题 Tedit(s) 的 onkeyup 事件中调用我们的“HideVirtualKeyboard”例程来实现部分解决方法,但是当键盘闪烁然后消失时,这看起来很愚蠢。此外,如果一个人在关注问题 Tedit 后移动到应用程序中的另一个 TTabItem,则物理键盘上的按键将弹出虚拟键盘,并且必须采取特殊措施来摆脱它。

我将不胜感激任何建议。

标签: androiddelphikeyboardfiremonkey

解决方案


我已经使用 RFID 阅读器完成了一些项目,最终我自己在需要的地方控制了键盘。这是我的一个项目中的相同代码:

else if TabControl1.ActiveTab = tsRFID then
  begin
    {$ifdef NORFIDTYPING}
    VKAutoShowMode := TVKAutoShowMode.Never; // hide virtual keyboard
    {$endif}

应该注意的是,以下代码并不总是说实话:

function TfrmAppMain.KeyBoardVisible: Boolean;
var
  FService : IFMXVirtualKeyboardService;
begin
  Result := False;
  TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
  if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then
    Result := True;
end;

推荐阅读