说明:XE5 在 Android 平台上存在这一些键盘操作的问题,目前发现有下列几种:
- 按键盘上的隐藏键后,无法按上一页修改 XE5 源码「FMX.VirtualKeyboard.Android.pas」)。
- 按键盘上的隐藏键后,无法触发 OnVirtualKeyboardHidden事件。
- 关闭键盘后,再点一次无法显示键盘。
方法是参考「」在此感谢。
键盘问题,需要修改 XE5 源码「内容如下(}内为增加的部份):
{ === TRectF.Create(ConvertPixelToPoint(TPointF.Create(TotalRect.left,TotalRect.top +
<span style="color: #0000ff;">function
<span style="color: #000000;"> TVirtualKeyboardAndroid.GetVirtualKeyBoardState: TVirtualKeyBoardState;<span style="color: #0000ff;">begin
<span style="color: #0000ff;">if FError <span style="color: #0000ff;">then<span style="color: #000000;">
Result :=<span style="color: #000000;"> [vksError]
<span style="color: #0000ff;">else<span style="color: #000000;">
Result :=<span style="color: #000000;"> [];
<span style="color: #0000ff;">if IsAutoShow <span style="color: #0000ff;">then<span style="color: #000000;">
Result := Result +<span style="color: #000000;"> [vksAutoShow];
<span style="color: #0000ff;">if <span style="color: #0000ff;">not FError <span style="color: #0000ff;">then
<span style="color: #0000ff;">begin
<span style="color: #008000;">{<span style="color: #008000;">+++><span style="color: #008000;">}
//<span style="color: #000000;"> 这里只解决: 按键盘上的隐藏后,无法再按上一页的问题 (按上一页后,才会执行这里).
<span style="color: #0000ff;">if FState = vkbsVisible <span style="color: #0000ff;">then
<span style="color: #0000ff;">if ObtainKeyboardRect.Height < <span style="color: #800080;">30 <span style="color: #0000ff;">then<span style="color: #000000;">
SetState(TVirtualKeyboardAndroid.TvkbState.vkbsHidden);
<span style="color: #008000;">{<span style="color: #008000;"><+++<span style="color: #008000;">}
<span style="color: #0000ff;">if FState = vkbsVisible <span style="color: #0000ff;">then<span style="color: #000000;">
Result := Result +<span style="color: #000000;"> [vksVisible];
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">end;
Main.pas
<span style="color: #0000ff;">unit
<span style="color: #000000;"> Main; <span style="color: #0000ff;">interface<span style="color: #0000ff;">uses<span style="color: #000000;">
System.SysUtils,System.Types,System.UITypes,System.Classes,System.Variants,FMX.Platform,FMX.VirtualKeyboard.Android,FMX.VirtualKeyboard,FMX.Types,FMX.Controls,FMX.Forms,FMX.Graphics,FMX.Dialogs,FMX.Edit,FMX.StdCtrls,FMX.Layouts,FMX.Memo;
<span style="color: #0000ff;">type<span style="color: #000000;">
TForm1 = <span style="color: #0000ff;">class<span style="color: #000000;">(TForm)
ToolBar1: TToolBar;
Label1: TLabel;
VirtualKeyboardTimer: TTimer;
Memo1: TMemo;
Edit1: TEdit;
<span style="color: #0000ff;">procedure<span style="color: #000000;"> FormVirtualKeyboardHidden(Sender: TObject;
KeyboardVisible: Boolean; <span style="color: #0000ff;">const<span style="color: #000000;"> Bounds: TRect);
<span style="color: #0000ff;">procedure<span style="color: #000000;"> FormVirtualKeyboardShown(Sender: TObject;
KeyboardVisible: Boolean; <span style="color: #0000ff;">const<span style="color: #000000;"> Bounds: TRect);
<span style="color: #0000ff;">procedure<span style="color: #000000;"> VirtualKeyboardTimerTimer(Sender: TObject);
<span style="color: #0000ff;">procedure<span style="color: #000000;"> Edit1Click(Sender: TObject);
<span style="color: #0000ff;">private
<span style="color: #008000;">{<span style="color: #008000;"> private declarations <span style="color: #008000;">}
<span style="color: #0000ff;">public
<span style="color: #008000;">{<span style="color: #008000;"> Public declarations <span style="color: #008000;">}
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">var<span style="color: #000000;">
Form1: TForm1;
<span style="color: #0000ff;">implementation
<span style="color: #008000;">{<span style="color: #008000;">$R *.fmx<span style="color: #008000;">}
//<span style="color: #000000;"> 显示键盘
<span style="color: #0000ff;">function ShowVirtualKeyboard(<span style="color: #0000ff;">const<span style="color: #000000;"> AControl: TFmxObject): Boolean;
<span style="color: #0000ff;">var<span style="color: #000000;"> Service1: IFMXVirtualKeyboardService;
<span style="color: #0000ff;">begin
<span style="color: #0000ff;">if (ObtainKeyboardRect.Height < <span style="color: #800080;">30) <span style="color: #0000ff;">and<span style="color: #000000;">
TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService,IInterface(Service1)) <span style="color: #0000ff;">then<span style="color: #000000;">
Result :=<span style="color: #000000;"> Service1.ShowVirtualKeyboard(AControl)
<span style="color: #0000ff;">else Result :=<span style="color: #000000;"> False;
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">procedure<span style="color: #000000;"> TForm1.FormVirtualKeyboardHidden(Sender: TObject;
KeyboardVisible: Boolean; <span style="color: #0000ff;">const<span style="color: #000000;"> Bounds: TRect);
<span style="color: #0000ff;">begin<span style="color: #000000;">
Edit1.Text := <span style="color: #800000;">'<span style="color: #800000;">Keyboard hidden!<span style="color: #800000;">'<span style="color: #000000;">;
Memo1.Text := Format(<span style="color: #800000;">'<span style="color: #800000;">W: %d H: %d<span style="color: #800000;">'<span style="color: #000000;">,[Bounds.Width,Bounds.Height]);
VirtualKeyboardTimer.Enabled :</span>= False; //<span style="color: #000000;"> <a href="/tag/guanbi/" target="_blank" class="keywords">关闭</a>检查<a href="/tag/jianpan/" target="_blank" class="keywords">键盘</a>高度
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">procedure<span style="color: #000000;"> TForm1.FormVirtualKeyboardShown(Sender: TObject;
KeyboardVisible: Boolean; <span style="color: #0000ff;">const<span style="color: #000000;"> Bounds: TRect);
<span style="color: #0000ff;">begin<span style="color: #000000;">
Edit1.Text := <span style="color: #800000;">'<span style="color: #800000;">Keyboard shown!<span style="color: #800000;">'<span style="color: #000000;">;
Memo1.Text := Format(<span style="color: #800000;">'<span style="color: #800000;">W: %d H: %d<span style="color: #800000;">'<span style="color: #000000;">,Bounds.Height]);
VirtualKeyboardTimer.Enabled :</span>= True; //<span style="color: #000000;"> 开启检查<a href="/tag/jianpan/" target="_blank" class="keywords">键盘</a>高度
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">procedure<span style="color: #000000;"> TForm1.VirtualKeyboardTimerTimer(Sender: TObject);
<span style="color: #0000ff;">var<span style="color: #000000;"> R: TRect;
<span style="color: #0000ff;">begin
// 检查键盘高度 < <span style="color: #800080;">30<span style="color: #000000;"> 代表键盘关闭.
R :=<span style="color: #000000;"> ObtainKeyboardRect;
<span style="color: #0000ff;">if R.Height < <span style="color: #800080;">30 <span style="color: #0000ff;">then<span style="color: #000000;">
Self.OnVirtualKeyboardHidden(Sender,False,R);
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">procedure<span style="color: #000000;"> TForm1.Edit1Click(Sender: TObject);
<span style="color: #0000ff;">begin
//<span style="color: #000000;"> 在 TEdit 或 TMemo 需要用到键盘的控件,加入下行,才能确保关闭键盘后,再点一次可以显示键盘.
ShowVirtualKeyboard(TFmxObject(Sender));
<span style="color: #0000ff;">end<span style="color: #000000;">;
<span style="color: #0000ff;">end.
键盘上的隐藏键」是指下图所示位置: