uUIFunction.pas中有在Frame中处理虚拟键盘的相关函数和接口,

这个文件在OrangeUI Samples(示例)\OrangeProjectCommon目录里面,

 

 

新建一个工程,

 

uUIFunction.pas这个单元添加到工程中去,并且在主窗体中引用此单元,

 

再设置主窗体的虚拟键盘事件

 

在虚拟键盘显示事件OnVirtualKeyboardShown中,

加上用于通知Frame虚拟键盘事件显示的过程,

CallSubFrameVirtualKeyboardShown(Sender,Self,KeyboardVisible,Bounds);

 

虚拟键盘隐藏事件OnVirtualKeyboardHidden事件加上

加上用于通知Frame虚拟键盘事件隐藏的过程,

CallSubFrameVirtualKeyboardHidden(Sender,Self,KeyboardVisible,Bounds); 

 

并且在主窗体的OnShow事件中加入修复Android下的虚拟键盘隐藏和显示的代码:GetGlobalVirtualKeyboardFixer.StartSync(Self);

 

 

新建一个FrameNameFrameLogin,单元名为LoginFrame.pas,

我们用它来做为登陆界面,

 

Frame上放好Panel,取名为pnlVirtualKeyboard,

Align设置为Bottom,

放好ScrollBox,取名为sbClient,Align设置为Client,

ScrollBox上面放好ScrollBoxContent,取名为sbcClient,

 

再在ScrollBoxContent上面放好用户名和密码所需要的Edit控件,

如下图所示:

 

Frame要想响应虚拟键盘显示和隐藏的事件,

就要实现我在uUIFunction.pas单元中定义的IFrameVirtualKeyboardEvent接口,

 

  IFrameVirtualKeyboardEvent=interface

    ['{3EA28E86-BEC2-432A-A744-C5210B0D3B85}']

    //显示虚拟键盘

    procedure DoVirtualKeyboardShow(KeyboardVisible: Boolean; const Bounds: TRect);

    //隐藏虚拟键盘

    procedure DoVirtualKeyboardHide(KeyboardVisible: Boolean; const Bounds: TRect);

  end;

 

LoginFrame.pas的引用uUIFunction单元,

FrameLogin的声明中加入IFrameVirtualKeyboardEvent,

再加入接口的两个方法,

并实现这两个方法:

就是在虚拟键盘隐藏的时候,把pnlVirtualKeyboard的高度设置为0,

在虚拟键盘显示的时候,把它的高度设置为虚拟键盘的高度,

这样,ScrollBox的滚动空间就在虚拟键盘上面了,不会被挡住,

再设置ScrollBox.VertScrollBar的滚动位置为刚好显示出来登陆按钮,

 

 

 

在窗体的FormShow事件中动态创建LoginFrame来显示登陆页面,

var

  ALoginFrame:TFrameLogin;

begin

  ALoginFrame:=TFrameLogin.Create(Self);

  ALoginFrame.Parent:=Self;

  ALoginFrame.Align:=TAlignLayout.Client;