Delphi FMX - Android 中的虚拟键盘覆盖控制(无效的键盘高度)

Roh*_*hit 6 delphi keyboard android firemonkey delphi-10.2-tokyo

我创建了一个简单的 FMX 表单(在 Delphi Tokyo 10.2.1 中),上面有 3 个控件:

  1. TLayout(LayoutKbd) - 与屏幕底部对齐。高度 1。
  2. TRectangle- 与底部对齐(在 TLayout 上方)。高度 5。
  3. TMemo - 与客户保持一致。

在表单的OnVirtualKeyboardShown事件中,我有以下代码:

procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  if KeyboardVisible then
  begin
    LayoutKbd.Height:=Bounds.Height;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

当我在我的 Android 手机上运行它并触摸备忘录内部时,会显示虚拟键盘并触发事件。然而,下面的值Bounds.Height是一个随机的、大的、负数(请参阅调试期间的局部变量)。

在此处输入图片说明

根据文档

事件处理程序的 Bounds 参数指定虚拟键盘窗口的屏幕坐标

我希望屏幕来显示我的键盘(重叠我的TLayout),它上面TRectangle和上面说我的TMemo。但是由于没有显示布局的高度,虚拟键盘覆盖了备忘录的一部分。

我可能遗漏了一些非常基本的东西。我的问题是:

  • 如何获得虚拟键盘的高度?
  • 我在尝试从边界获取高度时做错了什么吗?(我也试过从中获取高度Bounds.Size.Height- 这也不起作用)
  • 是否有不同/更好的方法来可靠地调整我的备忘录的大小,以便虚拟键盘不会遮挡它。

感谢在这方面的任何帮助或指导。

更新 20170906:鉴于我在 10.2.1 东京的总体体验不佳,我决定在 10.1.2 柏林尝试代码。有趣的是,该代码在柏林工作 - 但据报道键盘的高度比它应该的高度高出 25 像素。因此,通过使用LayoutKbd.Height:=Bounds.Height - 25;,我可以获得键盘的确切高度。虽然这仍然是一个问题(与RSP-14004相关),但它是可以处理的。

所以这看起来像是 Tokyo 10.2.1 的一个错误 - 我已经在 Quality Portal ( RSP-19001 )上提交了一张票。我对围绕东京 10.2.1 的质量问题越来越感到沮丧。我们在 Delphi 上花费了大量资金,而 Embarcadero 在推出主要版本时确实需要齐心协力,以使其至少相对没有错误。东京好像很不靠谱……

更新 20171201:对于 Android,我强烈推荐Dave NottageKastriFree 库,它实现了一个简单易用的基于消息的通知机制。我一直在我的 Android 应用程序中使用它,它运行完美!