说明: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 里,改动内容如下({+++>}内为增加的部份{<+++}):

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 键盘三个问题的更多相关文章

  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. VS2015的一些资料

    http://blog.csdn.net/hk_5788/article/details/48466295 主要看一下js支持方面的,另外今天复习了promise,刚入职的时候看得有些问题,今晚抽时间 ...

  2. Node.js与Sails~Model和ORM的持久化

    回到目录 上一讲说了在sails里定义model及相关参数的说明,这一讲主要说一下如何将你的Model持久化到文件,关系数据库和Nosql数据库里,在持久化这点上,sails是统一管理的,它可以在/c ...

  3. Android开发学习之路-Service和Activity的通信

    在很多时候,Service都不仅仅需要在后台运行,还需要和Activity进行通信,或者接受Activity的指挥,如何来实现,来看代码. 定义一个服务 // 创建一个服务,然后在onBind()中返 ...

  4. [Spring框架] Spring中的 ContextLoaderListener 实现原理.

    前言: 这是关于Spring的第三篇文章, 打算后续还会写入AOP 和Spring 事务管理相关的文章, 这么好的两个周末 都在看code了, 确实是有所收获, 现在就来记录一下. 在上一篇讲解Spr ...

  5. 【管理心得之四十】中文“其他”、英文“other”、日文“その他”..........................................

    场景再现====================={某研讨会}本学期为:调查研究.整理总结阶段.本阶段的主要任务是: 一.学习理论,收集.汇编学习资料,提高自己的素质..... 二.通过对部分班级学生 ...

  6. iOS开发----优秀文章推荐

    UI界面 iOS和Android 界面设计尺寸规范  http://www.alibuybuy.com/posts/85486.html iPhone app界面设计尺寸规范  http://www. ...

  7. python学习 文件操作

    一.python打开文件 #=====================python 文件打开方式 open()===================== # open(fileName,type) t ...

  8. JS BOM

    一.window对象 //系统对话框 var flag=confirm("提示语句");//弹出一个对话框 当你点击确定flag=true,点击取消flag=false: var ...

  9. js 字符串的操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. PHP 对象 “==” 与 “===”

    php中对象在内存中的存储方式与java等其他面向对象语言类似,$a = new Person();在内存中表现为$a是堆区中new Person()中的引用 这样当: $a = new Person ...