说明:XE5 在 Android 平台上存在这一些键盘操作的问题,目前发现有下列几种:

  1. 按键盘上的隐藏键后,无法按上一页(需要修改 XE5 源码「FMX.VirtualKeyboard.Android.pas」)。
  2. 按键盘上的隐藏键后,无法触发 OnVirtualKeyboardHidden 事件。
  3. 关闭键盘后,再点一次无法显示键盘(大部份机子都有这个问题,实测 Nexus 7 II 没有这个问题)。

适用:Delphi XE5 update 2

参考:此修正方法是参考「完美解决 XE5 安卓下 虚拟键盘 隐藏没有事件的 BUG。」在此感谢。

源码下载:修正XE5_Android键盘三个问题.zip

目前发现的键盘问题,需要修改 XE5 源码「FMX.VirtualKeyboard.Android.pas」才能修正,改好的档案已经放在上面源码 zip 里,改动内容如下({+++>}内为增加的部份{<+++}):

  1. FMX.VirtualKeyboard.Android.pas
  2.  
  3. {+++>}
  4. function ObtainKeyboardRect: TRect;
  5. var
  6. ContentRect, TotalRect: JRect;
  7. begin
  8. ContentRect := TJRect.Create;
  9. TotalRect := TJRect.Create;
  10. MainActivity.getWindow.getDecorView.getWindowVisibleDisplayFrame(ContentRect);
  11. MainActivity.getWindow.getDecorView.getDrawingRect(TotalRect);
  12. Result := TRectF.Create(ConvertPixelToPoint(TPointF.Create(TotalRect.left, TotalRect.top + ContentRect.height)),
  13. ConvertPixelToPoint(TPointF.Create(TotalRect.right, TotalRect.bottom))).Truncate;
  14. end;
  15. {<+++}
  16.  
  17. function TVirtualKeyboardAndroid.GetVirtualKeyBoardState: TVirtualKeyBoardState;
  18. begin
  19. if FError then
  20. Result := [vksError]
  21. else
  22. Result := [];
  23. if IsAutoShow then
  24. Result := Result + [vksAutoShow];
  25. if not FError then
  26. begin
  27. {+++>}
  28. // 这里只解决: 按键盘上的隐藏后, 无法再按上一页的问题 (按上一页后, 才会执行这里).
  29. if FState = vkbsVisible then
  30. if ObtainKeyboardRect.Height < then
  31. SetState(TVirtualKeyboardAndroid.TvkbState.vkbsHidden);
  32. {<+++}
  33. if FState = vkbsVisible then
  34. Result := Result + [vksVisible];
  35. end;
  36. end;

Main.pas

  1. //------------------------------------------------------------------------------
  2. // 2014.04. by 龟山阿卍 QQ -
  3. // http://www.cnblogs.com/onechen/ -
  4. // -
  5. // 需修改 -
  6. // FMX.VirtualKeyboard.Android.pas -
  7. //------------------------------------------------------------------------------
  8.  
  9. unit Main;
  10.  
  11. interface
  12.  
  13. uses
  14. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  15.  
  16. FMX.Platform,
  17. FMX.VirtualKeyboard.Android,
  18. FMX.VirtualKeyboard,
  19.  
  20. FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit,
  21. FMX.StdCtrls, FMX.Layouts, FMX.Memo;
  22.  
  23. type
  24. TForm1 = class(TForm)
  25. ToolBar1: TToolBar;
  26. Label1: TLabel;
  27. VirtualKeyboardTimer: TTimer;
  28. Memo1: TMemo;
  29. Edit1: TEdit;
  30. procedure FormVirtualKeyboardHidden(Sender: TObject;
  31. KeyboardVisible: Boolean; const Bounds: TRect);
  32. procedure FormVirtualKeyboardShown(Sender: TObject;
  33. KeyboardVisible: Boolean; const Bounds: TRect);
  34. procedure VirtualKeyboardTimerTimer(Sender: TObject);
  35. procedure Edit1Click(Sender: TObject);
  36. private
  37. { private declarations }
  38. public
  39. { Public declarations }
  40. end;
  41.  
  42. var
  43. Form1: TForm1;
  44.  
  45. implementation
  46.  
  47. {$R *.fmx}
  48.  
  49. // 显示键盘
  50. function ShowVirtualKeyboard(const AControl: TFmxObject): Boolean;
  51. var Service1: IFMXVirtualKeyboardService;
  52. begin
  53. if (ObtainKeyboardRect.Height < ) and
  54. TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(Service1)) then
  55. Result := Service1.ShowVirtualKeyboard(AControl)
  56. else Result := False;
  57. end;
  58.  
  59. procedure TForm1.FormVirtualKeyboardHidden(Sender: TObject;
  60. KeyboardVisible: Boolean; const Bounds: TRect);
  61. begin
  62. Edit1.Text := 'Keyboard hidden!';
  63. Memo1.Text := Format('W: %d H: %d', [Bounds.Width, Bounds.Height]);
  64.  
  65. VirtualKeyboardTimer.Enabled := False; // 关闭检查键盘高度
  66. end;
  67.  
  68. procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
  69. KeyboardVisible: Boolean; const Bounds: TRect);
  70. begin
  71. Edit1.Text := 'Keyboard shown!';
  72. Memo1.Text := Format('W: %d H: %d', [Bounds.Width, Bounds.Height]);
  73.  
  74. VirtualKeyboardTimer.Enabled := True; // 开启检查键盘高度
  75. end;
  76.  
  77. procedure TForm1.VirtualKeyboardTimerTimer(Sender: TObject);
  78. var R: TRect;
  79. begin
  80. // 检查键盘高度 < 代表键盘关闭.
  81. R := ObtainKeyboardRect;
  82. if R.Height < then
  83. Self.OnVirtualKeyboardHidden(Sender, False, R);
  84. end;
  85.  
  86. procedure TForm1.Edit1Click(Sender: TObject);
  87. begin
  88. // 在 TEdit 或 TMemo 需要用到键盘的控件, 加入下行, 才能确保关闭键盘后, 再点一次可以显示键盘.
  89. ShowVirtualKeyboard(TFmxObject(Sender));
  90. end;
  91.  
  92. end.

「键盘上的隐藏键」是指下图所示位置:

修正 XE5 Android 键盘三个问题的更多相关文章

  1. xe5 android 手机上使用sqlite [转]

    在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank applicatio ...

  2. 免Root停用“Android键盘(AOSP)”

    一.效果:隐藏手机状态栏输入法选择图标: 二.手段:使用ADB免root 停用系统默认Android键盘(AOSP),这里参考了大神的方法,在此表示感谢: 三.实现过程: 上图 下面就是按照大神的方法 ...

  3. android键盘输入读取

    android键盘输入读取  监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...

  4. xe5 android tts(Text To Speech)

    xe5 android  tts(Text To Speech) TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话. 以下代码实现xe5 开发的文本转 ...

  5. XE5 ANDROID通过webservice访问操作MSSQL数据库

    上接XE5 ANDROID平台 调用 webservice 一.服务端 在ro里添加函数(在impl上添加阿东connection,adoquery,dataprovider) function TN ...

  6. Android动画 三种动画

    Android可以使用三种动画 Frame Animation-帧动画 ,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果 Tween Animation-补间动画,给出两个关键帧, ...

  7. delphi xe5 android 服务端和手机端的源码下载

    xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar

  8. 【转】Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos ...

  9. 【转】android camera(三):camera V4L2 FIMC

    关键词:android  camera CMM 模组 camera参数  CAMIF   V4L2  平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...

随机推荐

  1. 解决服务器每次都要输入Enter PEM pass phrase

    今天架设好Python的HTTPS云服务器, 发现每次连接都要Enter PEM pass phrase 把服务器端的key里面的key剥离掉就好了 openssl rsa -in server.ke ...

  2. Atitit  如何让精灵控件运动

    Atitit  如何让精灵控件运动 ##让Sushi精灵动起来 上面的代码,我们创建了静态的sushiSprite,现在我们让它动起来.使它从屏幕顶部下落到屏幕底部.在addSushi方法中添加如下代 ...

  3. 如何解决loadrunner回放日志中的乱码问题

    在Loadrunner回放脚本时,会看到replay log区会展示脚本回放时的信息.有时候选中了打印服务器返回具体信息后,服务器返回的中文字符为乱码.怎么破? 原来Loadrunner的replay ...

  4. .NET 程序启动调试器 .NET 测试代码耗费时间

    有些场景的.NET程序,不容易设置断点,可以用下面的方法,在.NET代码中增加启动调试器的代码: if (!Debugger.IsAttached) Debugger.Launch(); .cshar ...

  5. setTimeout,clearTimeout和setInterval

    http://www.cnblogs.com/backuper/archive/2009/12/02/1615129.html var timeout; timeout = setTimeout(hi ...

  6. SilverLight 控件ListBox中的SelectionChanged事件

    出现的问题: ListBox 中给了它一个这样的事件SelectionChanged="NumBasket_SelectionChanged" 也就是单击某行就会触发的事件,要实现 ...

  7. React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  8. struts2标签

    一.通用标签 1.property     Name Required Default Evaluated Type Description default false   false String ...

  9. 实现CSS等分布局的4种方式

    × 目录 [1]float [2]inline-block [3]table[4]flex 前面的话 等分布局是指子元素平均分配父元素宽度的布局方式,本文将介绍实现等分布局的4种方式 思路一: flo ...

  10. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...