修正 XE5 Android 键盘三个问题
说明:XE5 在 Android 平台上存在这一些键盘操作的问题,目前发现有下列几种:
- 按键盘上的隐藏键后,无法按上一页(需要修改 XE5 源码「FMX.VirtualKeyboard.Android.pas」)。
- 按键盘上的隐藏键后,无法触发 OnVirtualKeyboardHidden 事件。
- 关闭键盘后,再点一次无法显示键盘(大部份机子都有这个问题,实测 Nexus 7 II 没有这个问题)。
适用:Delphi XE5 update 2
参考:此修正方法是参考「完美解决 XE5 安卓下 虚拟键盘 隐藏没有事件的 BUG。」在此感谢。
目前发现的键盘问题,需要修改 XE5 源码「FMX.VirtualKeyboard.Android.pas」才能修正,改好的档案已经放在上面源码 zip 里,改动内容如下({+++>}内为增加的部份{<+++}):
- FMX.VirtualKeyboard.Android.pas
- {+++>}
- function ObtainKeyboardRect: TRect;
- var
- ContentRect, TotalRect: JRect;
- begin
- ContentRect := TJRect.Create;
- TotalRect := TJRect.Create;
- MainActivity.getWindow.getDecorView.getWindowVisibleDisplayFrame(ContentRect);
- MainActivity.getWindow.getDecorView.getDrawingRect(TotalRect);
- Result := TRectF.Create(ConvertPixelToPoint(TPointF.Create(TotalRect.left, TotalRect.top + ContentRect.height)),
- ConvertPixelToPoint(TPointF.Create(TotalRect.right, TotalRect.bottom))).Truncate;
- end;
- {<+++}
- function TVirtualKeyboardAndroid.GetVirtualKeyBoardState: TVirtualKeyBoardState;
- begin
- if FError then
- Result := [vksError]
- else
- Result := [];
- if IsAutoShow then
- Result := Result + [vksAutoShow];
- if not FError then
- begin
- {+++>}
- // 这里只解决: 按键盘上的隐藏后, 无法再按上一页的问题 (按上一页后, 才会执行这里).
- if FState = vkbsVisible then
- if ObtainKeyboardRect.Height < then
- SetState(TVirtualKeyboardAndroid.TvkbState.vkbsHidden);
- {<+++}
- if FState = vkbsVisible then
- Result := Result + [vksVisible];
- end;
- end;
Main.pas
- //------------------------------------------------------------------------------
- // 2014.04. by 龟山阿卍 QQ -
- // http://www.cnblogs.com/onechen/ -
- // -
- // 需修改 -
- // FMX.VirtualKeyboard.Android.pas -
- //------------------------------------------------------------------------------
- unit Main;
- interface
- uses
- 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;
- type
- TForm1 = class(TForm)
- ToolBar1: TToolBar;
- Label1: TLabel;
- VirtualKeyboardTimer: TTimer;
- Memo1: TMemo;
- Edit1: TEdit;
- procedure FormVirtualKeyboardHidden(Sender: TObject;
- KeyboardVisible: Boolean; const Bounds: TRect);
- procedure FormVirtualKeyboardShown(Sender: TObject;
- KeyboardVisible: Boolean; const Bounds: TRect);
- procedure VirtualKeyboardTimerTimer(Sender: TObject);
- procedure Edit1Click(Sender: TObject);
- private
- { private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.fmx}
- // 显示键盘
- function ShowVirtualKeyboard(const AControl: TFmxObject): Boolean;
- var Service1: IFMXVirtualKeyboardService;
- begin
- if (ObtainKeyboardRect.Height < ) and
- TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(Service1)) then
- Result := Service1.ShowVirtualKeyboard(AControl)
- else Result := False;
- end;
- procedure TForm1.FormVirtualKeyboardHidden(Sender: TObject;
- KeyboardVisible: Boolean; const Bounds: TRect);
- begin
- Edit1.Text := 'Keyboard hidden!';
- Memo1.Text := Format('W: %d H: %d', [Bounds.Width, Bounds.Height]);
- VirtualKeyboardTimer.Enabled := False; // 关闭检查键盘高度
- end;
- procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
- KeyboardVisible: Boolean; const Bounds: TRect);
- begin
- Edit1.Text := 'Keyboard shown!';
- Memo1.Text := Format('W: %d H: %d', [Bounds.Width, Bounds.Height]);
- VirtualKeyboardTimer.Enabled := True; // 开启检查键盘高度
- end;
- procedure TForm1.VirtualKeyboardTimerTimer(Sender: TObject);
- var R: TRect;
- begin
- // 检查键盘高度 < 代表键盘关闭.
- R := ObtainKeyboardRect;
- if R.Height < then
- Self.OnVirtualKeyboardHidden(Sender, False, R);
- end;
- procedure TForm1.Edit1Click(Sender: TObject);
- begin
- // 在 TEdit 或 TMemo 需要用到键盘的控件, 加入下行, 才能确保关闭键盘后, 再点一次可以显示键盘.
- ShowVirtualKeyboard(TFmxObject(Sender));
- end;
- end.
「键盘上的隐藏键」是指下图所示位置:
修正 XE5 Android 键盘三个问题的更多相关文章
- xe5 android 手机上使用sqlite [转]
在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank applicatio ...
- 免Root停用“Android键盘(AOSP)”
一.效果:隐藏手机状态栏输入法选择图标: 二.手段:使用ADB免root 停用系统默认Android键盘(AOSP),这里参考了大神的方法,在此表示感谢: 三.实现过程: 上图 下面就是按照大神的方法 ...
- android键盘输入读取
android键盘输入读取 监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...
- xe5 android tts(Text To Speech)
xe5 android tts(Text To Speech) TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话. 以下代码实现xe5 开发的文本转 ...
- XE5 ANDROID通过webservice访问操作MSSQL数据库
上接XE5 ANDROID平台 调用 webservice 一.服务端 在ro里添加函数(在impl上添加阿东connection,adoquery,dataprovider) function TN ...
- Android动画 三种动画
Android可以使用三种动画 Frame Animation-帧动画 ,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果 Tween Animation-补间动画,给出两个关键帧, ...
- delphi xe5 android 服务端和手机端的源码下载
xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar
- 【转】Android LCD(三):Samsung LCD接口篇
关键词:android LCD控制器 Framebuffer PWM 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos ...
- 【转】android camera(三):camera V4L2 FIMC
关键词:android camera CMM 模组 camera参数 CAMIF V4L2 平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...
随机推荐
- 解决服务器每次都要输入Enter PEM pass phrase
今天架设好Python的HTTPS云服务器, 发现每次连接都要Enter PEM pass phrase 把服务器端的key里面的key剥离掉就好了 openssl rsa -in server.ke ...
- Atitit 如何让精灵控件运动
Atitit 如何让精灵控件运动 ##让Sushi精灵动起来 上面的代码,我们创建了静态的sushiSprite,现在我们让它动起来.使它从屏幕顶部下落到屏幕底部.在addSushi方法中添加如下代 ...
- 如何解决loadrunner回放日志中的乱码问题
在Loadrunner回放脚本时,会看到replay log区会展示脚本回放时的信息.有时候选中了打印服务器返回具体信息后,服务器返回的中文字符为乱码.怎么破? 原来Loadrunner的replay ...
- .NET 程序启动调试器 .NET 测试代码耗费时间
有些场景的.NET程序,不容易设置断点,可以用下面的方法,在.NET代码中增加启动调试器的代码: if (!Debugger.IsAttached) Debugger.Launch(); .cshar ...
- setTimeout,clearTimeout和setInterval
http://www.cnblogs.com/backuper/archive/2009/12/02/1615129.html var timeout; timeout = setTimeout(hi ...
- SilverLight 控件ListBox中的SelectionChanged事件
出现的问题: ListBox 中给了它一个这样的事件SelectionChanged="NumBasket_SelectionChanged" 也就是单击某行就会触发的事件,要实现 ...
- React 入门实例教程
现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...
- struts2标签
一.通用标签 1.property Name Required Default Evaluated Type Description default false false String ...
- 实现CSS等分布局的4种方式
× 目录 [1]float [2]inline-block [3]table[4]flex 前面的话 等分布局是指子元素平均分配父元素宽度的布局方式,本文将介绍实现等分布局的4种方式 思路一: flo ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...