Android实例-解决虚拟键盘遮挡问题(XE8+小米2)

结果:

1.可以自动向上移动,来防遮挡,但同时发现个问题,如果是按硬件返回没有问题,要是点输入法(QQ、百度输入法)上的隐藏就不行了。

2.点击Edit2后出现输入法,点输入法上的隐藏后, 再点Edit2输入法不再显示。

实例代码:

  1 unit Unit1;
  2
  3 interface
  4
  5 uses
  6   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  7   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ComboEdit,
  8   FMX.Edit, FMX.EditBox, FMX.NumberBox, FMX.DateTimeCtrls, FMX.ScrollBox,
  9   FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls,
 10   System.Math,//需要引入
 11   FMX.VirtualKeyboard,//需要引入
 12   FMX.Layouts;
 13
 14 type
 15   TForm1 = class(TForm)
 16     VertScrollBox1: TVertScrollBox;
 17     Layout1: TLayout;
 18     Memo1: TMemo;
 19     Label1: TLabel;
 20     Button1: TButton;
 21     Edit1: TEdit;
 22     Edit2: TEdit;
 23     procedure FormCreate(Sender: TObject);
 24     procedure FormFocusChanged(Sender: TObject);
 25     procedure FormVirtualKeyboardHidden(Sender: TObject;
 26       KeyboardVisible: Boolean; const Bounds: TRect);
 27     procedure FormVirtualKeyboardShown(Sender: TObject;
 28       KeyboardVisible: Boolean; const Bounds: TRect);
 29   private
 30     //定义移位标记
 31     FKBBounds:TRectF;
 32     FNeedOffset: Boolean;
 33     procedure CalcContentBoundsProc(Sender: TObject; var ContentBounds: TRectF);
 34     procedure RestorePosition;
 35     procedure UpdateKBBounds;
 36     { Private declarations }
 37   public
 38     { Public declarations }
 39   end;
 40
 41 var
 42   Form1: TForm1;
 43
 44 implementation
 45
 46 {$R *.fmx}
 47 {$R *.NmXhdpiPh.fmx ANDROID}
 48
 49 //赋值事件
 50 procedure TForm1.FormCreate(Sender: TObject);
 51 begin
 52   VertScrollBox1.OnCalcContentBounds := CalcContentBoundsProc;
 53 end;
 54
 55 //每次焦点改变都要更新位置
 56 procedure TForm1.FormFocusChanged(Sender: TObject);
 57 begin
 58   UpdateKBBounds;
 59 end;
 60
 61 //输入法隐藏时的处理
 62 procedure TForm1.FormVirtualKeyboardHidden(Sender: TObject;
 63   KeyboardVisible: Boolean; const Bounds: TRect);
 64 begin
 65   FKBBounds.Create(0, 0, 0, 0);
 66   FNeedOffset := False;
 67   RestorePosition;
 68 end;
 69
 70 //输入法显示时的处理
 71 procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
 72   KeyboardVisible: Boolean; const Bounds: TRect);
 73 begin
 74   FKBBounds := TRectF.Create(Bounds);
 75   FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);
 76   FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);
 77   UpdateKBBounds;
 78 end;
 79
 80 //计算内容边界
 81 procedure TForm1.CalcContentBoundsProc(Sender: TObject;
 82   var ContentBounds: TRectF);
 83 begin
 84   if FNeedOffset and (FKBBounds.Top > 0) then
 85   begin
 86     ContentBounds.Bottom := Max(ContentBounds.Bottom, 2 * ClientHeight - FKBBounds.Top);
 87   end;
 88 end;
 89
 90 //还原位置
 91 procedure TForm1.RestorePosition;
 92 begin
 93   VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, 0);
 94   Layout1.Align := TAlignLayout.Client;
 95   VertScrollBox1.RealignContent;
 96 end;
 97
 98 //更新边界
 99 procedure TForm1.UpdateKBBounds;
100 var
101   LFocused : TControl;
102   LFocusRect: TRectF;
103 begin
104   FNeedOffset := False;
105   if Assigned(Focused) then
106   begin
107     LFocused := TControl(Focused.GetObject);
108     LFocusRect := LFocused.AbsoluteRect;
109     LFocusRect.Offset(VertScrollBox1.ViewportPosition);
110     if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and
111        (LFocusRect.Bottom > FKBBounds.Top) then
112     begin
113       FNeedOffset := True;
114       Layout1.Align := TAlignLayout.Horizontal;
115       VertScrollBox1.RealignContent;
116       Application.ProcessMessages;
117       VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, LFocusRect.Bottom - FKBBounds.Top);
118     end;
119   end;
120   if not FNeedOffset then
121     RestorePosition;
122 end;
123
124 end.

PS:

1.本实例来自官方demo(D:\DelphiXE8\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Samples\User Interface\ScrollableForm)。

2.控件布局是VertScrollBox1、Layout1,之后的控件都是在Layout1上的。

时间: 2024-07-30 21:57:39

Android实例-解决虚拟键盘遮挡问题(XE8+小米2)的相关文章

Android实例-解决启动黑屏问题(XE8+小米2)

结果: 1.在启动时马上出现图片界面,但在出现程序界面前会有黑屏,大约有0.2秒左右. 实现: 1.建立2个文件:loading.png和styles.xml: ①其中loading.png是启动时替代黑屏的图片. ②styles.xml是对背景图片的定义,其内容为: 1 <resources> 2 3 <!-- 4 Base application theme, dependent on API level. This theme is replaced 5 by AppBaseThe

Android实例-MediaPlayer播放音乐和视频(XE8+小米2)

结果: 1.播放视频需要手动放入MediaPlayerControl1控件,设置MediaPlayerControl1.MediaPlayer := MediaPlayer1; 2.播放声音文件正常,但播放器视时发现,第一边正常第二边就报错了(哪位大神知道的,请M我哦,先谢谢了). 3.打包时需要打入MP3与MP4文件,路径为"assets\internal\". 实例代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 System.SysUtils,

Android实例-录音与回放(播放MP3)(XE8+小米2)

结果: 1.增加ActionList中的Action时,需要跳到Master界面,不能在Android4Phonel界面下. 2.如果不打开权限的话,会提示“该设备不支持停止录音操作”(Record audion改为True). 3.播放的效果是播放一次就停止了.不是循环的. 实例代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 System.SysUtils, System.Types, System.UITypes, System.Classes, Sys

Android实例-获取安卓手机WIFI信息(XE8+小米2)

结果: 1.必须打开Access wifi state权限,不打开权限会出图二的错误. 相关资料: http://blog.csdn.net/lyf_lyf/article/category/173576 实例代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 FMX.Types, FMX.Contr

Android实例-监测网络状态及一些事件(XE8+小米2)

1.网络连接:是指现在可不可以上网(你非要问我什么是网,我会K你呀的). 2.WIFI网络:是指现在可以上网,用的是不是WIFI网络(如果你打开了WIFI那它会显示正在使用WIFI). 3.移动网络:是指现在可以上网,用的是不是移动网络(如果你打开了移动的数据流量它会显示移动网络). 第三方单元: 1 unit Androidapi.JNI.Network; 2 3 interface 4 5 function IsConnected: Boolean; 6 7 function IsWiFiC

LinearLayout详解四:彻底解决软键盘遮挡输入框的问题

之前把预备知识都介绍完了,话说学以致用,接下来我们要通过重载LinearLayout类来解决软键盘覆盖的问题. 首先阐述一下这个问题,如下图所示: 然后看挡住输入框的情况 然后我们给出xml的源代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:lay

【转】iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法

iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击return和屏幕隐藏键盘 这个首先引用双子座的博客 http://my.oschina.net/plumsoft/blog/42545,他的文章写的很好,对大家的理解很有好处. 在 iOS 程序中当想要在文本框中输入数据,轻触文本框会打开键盘.对于 iPad 程序,其键盘有一个按钮可以用来关闭键盘,但是 iPhone 程序中的键盘却没有这样的按钮,不过我们可以采取一些方法关闭它.例如,我们可以实现按下 Rerun (有

IOS系统下虚拟键盘遮挡文本框问题的解决

最近在项目中发现同样的代码在Android端微信网页中点击文本框唤出的虚拟键盘不会遮挡文本框,但是在IOS端的微信网页中点击文本框唤出的键盘却在大部分情况下会遮挡文本框 经过高人指点,这个问题终于解决了 下面说说解决办法: 主要代码 document.body.scrollTop = document.body.scrollHeight; 然后在文本框获取焦点的时候,可以定义一个计时器,一直执行上面的那句话 在文本框失去焦点的时候,就把之前的计时器清除掉即可 js写法: let interval

android监听虚拟键盘隐藏和显示事件

刚开始在onconfigurationChanged中监听,结果发现该方法在configuration变化即配置文件发生变化时才会被调用,如横竖屏切换,android重新载入配置文件时.而键盘隐藏不会触发该方法. 后来采用如下方法完美解决了键盘隐藏监听事件. //该Activity的最外层Layout finalView activityRootView = findViewById(R.id.activityRoot); //给该layout设置监听,监听其布局发生变化事件 activityR