我创建了一个简单的FMX表单(在Delphi Tokyo 10.2.1中),上面有3个控件:
TLayout
(LayoutKbd) - 与屏幕底部对齐。身高1。TRectangle
- 与底部对齐(在TLayout上方)。高度5。TMemo
- 与客户保持一致。在表单的OnVirtualKeyboardShown
事件中,我有以下代码:
procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
KeyboardVisible: Boolean; const Bounds: TRect);
begin
if KeyboardVisible then
begin
LayoutKbd.Height:=Bounds.Height;
end;
end;
当我在Android手机上运行并触摸备忘录时,会显示虚拟键盘并触发事件。但是,Bounds.Height
的值是一个随机的,大的负数(请参阅调试期间的局部变量)。
事件处理程序的Bounds参数指定屏幕 虚拟键盘窗口的坐标
我希望屏幕能够向我显示键盘(重叠我的TLayout
),并在其上方TRectangle
以及我的TMemo
上方。但由于未显示布局的高度,因此虚拟键盘会覆盖备忘录的一部分。
我有可能遗漏一些非常基本的东西。我的问题是:
Bounds.Size.Height
获得高度 - 这也不起作用)感谢此事的任何帮助或指导。
UPDATE 20170906:鉴于我对10.2.1东京的体验普遍不佳,我决定尝试使用10.1.2柏林的代码。有趣的是,该代码在柏林有效 - 但据报道键盘的高度恰好比应有的高出25px。因此,通过使用LayoutKbd.Height:=Bounds.Height - 25;
,我可以获得键盘的确切高度。虽然这仍然是一个问题(与RSP-14004相关),但它可以使用。
所以这看起来像东京10.2.1的错误 - 我已经在Quality Portal(RSP-19001)上提交了一张票。我对东京10.2.1的质量问题越来越感到沮丧。我们在Delphi上投入了大量资金,Embarcadero确实需要在推出主要版本时采取行动,以便它至少相对没有bug。东京似乎非常不可靠......
更新20171201:对于Android,我强烈推荐KastriFree library by Dave Nottage,它实现了一种简单易用的基于消息的通知机制。我一直在我的Android应用程序中使用它,它完美无缺!