|
|
导航: |
论坛 -> 移动应用开发
斑竹:flyers,iamdream |
|
作者: |
|
2015/6/3 10:30:23 |
标题: |
不完美-FMX 程序中避免输入焦点被虚拟键盘遮挡 |
浏览:6359 |
|
加入我的收藏 |
楼主: |
转载自QDAC官网网站,文章发现问题可能随时更新,最新版本请访问:http://blog.qdac.cc/?p=2541
Delphi 提供了一个 Demo,叫 ScrollableFormDemo,要实现避免输入焦点被虚拟键盘遮挡的效果,需要写一堆的代码。也许这一切已不再重要,但是,它却没有考虑虚拟键盘隐藏的问题,在你隐藏虚拟键盘时,它没有自动回复原位,所以这一切显得更加的不完美。
为了避免每次都得写一堆代码的麻烦,我尝试换种思路来解决这一个问题,于是有了下面 vkbdhelper.pas 单元。但这个单元依然是三个字:不完美!不过我抛出来块砖,是希望将来第三方或官方能够更完美的解决这一问题。
首先说一下大概的思路:
1、订阅 TVKStateChangeMessage 消息,以得到普通的虚拟键盘状态改变消息。
2、在虚拟键盘显示后,触发一个每隔 100ms 检查一次的定时器,以便在用户主动隐藏虚拟键盘时,能够检查到它的改变。
3、如果检测到用户主动隐藏了虚拟键盘,那么自己触发一个TVKStateChangeMessage消息,这样子就回归到第 1 步正常的处理过程。也就是集中一个地方处理虚拟键盘状态的改变。
好了,思路有了,那么接下来是考虑易用性的问题:
实际上,易用性的设计一直是让人头痛的问题。我写这个单元就是为了解决系统自带的实现的不完美,虽然目前依然不是那么完美,但至少易用性上做到了我能做到的最好。你只需要在程序中的任意一个单元的 uses 里加入vkbdhelper,剩下的一句代码也不需要你去写。
接下来,还需要说啥呢?代码代表我的心~~~~
下载地址:http://pan.baidu.com/s/1c0DAgvQ
为什么我说这个设计依然不完美?
○ 我使用了滚动框来调整这个布局,如果表单本身没有,我就直接添加了一个。但这个将控件从一个父挪到另一个父的过程,我不能保证它的布局不会发生变更。 ○ 需要引入这个单元。 ○ 目前仅支持 Android,iOS 我没有去苹果的东东,就没去测试。
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外 |
作者: |
|
2015/6/3 10:37:00 |
1楼: |
本群 《不看后悔》 6.XXX 修复 安卓 输入法隐藏 后 无法退出的问题 3.4.txt
虽然不完美,但是肯定能解决问题。 当然,我这个还是需要自己写代码的,但是所有代码都给出了,抄就行。
ios 没有这个问题,无需修改。
----------------------------------------------
(C)(P)Flying Wang
|
作者: |
|
2015/6/3 11:16:49 |
2楼: |
不希望每次都去复制粘贴代码,希望是一次搞定。iOS 我现在没工夫去研究,如果有人愿意研究,欢迎提供解决方案。
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2015/6/3 12:14:31 |
3楼: |
多谢两位,正在搞这个问题
Delphi没把这个bug 解决很影响使用方便性
----------------------------------------------
-
|
作者: |
|
2015/6/3 13:40:10 |
4楼: |
没看明白, 我抄ScrollableFormDemo里的代码,没去改原代码,没感觉到有啥问题啊 输入法隐藏了,会自动回复原位 而且我的程序就一个主FROM ,其他的都是FRAME,子窗体都是从主FROM虚拟出来的 一样继承了主FROM的ScrollableFormDemo特性
----------------------------------------------
就怕想不到,没有做不到的
|
作者: |
|
2015/6/3 15:42:43 |
5楼: |
自带的没啥大问题,主要的问题在于: 1、需要每个窗体抄一遍代码,如果有多个窗体,你就知道多烦人了。 2、如果点击输入法的隐藏按钮,隐藏输入法,那么很不幸,你的程序如果没有自己处理vkHardwareBack,那么程序可能退不出来。(问题在于TVKListener不知道这个状态改变,然后没有设置TVirutalKeyboardAndroid.FState,而TPlatform.Android 里默认响应vkHardwareBack取的虚拟键盘的状态就错了。始终在那儿尝试关闭虚拟键盘,但明显没什么卵用,所以就退不出来了)
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2015/6/3 15:48:39 |
6楼: |
官网更新了最新版本,需要的可以到官网上下载,就不再重发了。优点就是只需要将它加入到工程中就行了,不需要修改任何文件。
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2015/6/3 16:12:05 |
7楼: |
@chineseswish 建议只一个TForm, 其他的子窗体都用【TFrame】嵌在这个Form上 我就是这样做的,
----------------------------------------------
就怕想不到,没有做不到的
|
作者: |
|
2015/6/3 16:32:33 |
8楼: |
我没有限定自己只用Frame,我是Frame+Form都会用,看实际情况来选择。
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2015/7/12 16:32:02 |
9楼: |
用vkdbhelper解决了这个问题 多谢
----------------------------------------------
-
|
作者: |
|
2015/7/16 8:42:54 |
10楼: |
2015.7.16 更完美 ========== * 修正了输入法隐藏后旋转屏幕时布局出现错乱的问题(感谢红鱼儿、多春鱼) * 修正了特定场景下出现多余空白的问题
下载地址:http://pan.baidu.com/s/1jGH4ye6
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2016/6/28 14:08:47 |
11楼: |
2016.6.28:针对滚动条优化 ==========
在滚动条惯性滚动过程中,不去尝试调整从而避免惯性滚动时的抖动现象(SVN 已更新)。我能说坑爹的动画中的 FStarted 没有公开,造成我不得不去用RTTI来检查是否处于动画中嘛:(
2016.6.1:重新设计调整算法 ==========
新算法考虑了滚动框和Memo等控件的支持,优先使用滚动类控件内部的滚动来调整位置,在不能满足需要时,才会整体上移布局 新版本已经加入 QDAC 的 SVN 源,并命名为 qdac_fmx_vkhelper.pas,以后更新直接检出即可 后面的下载仍是老版本,保持原样不再更新,以便供已经使用老版本,但不愿意改名的朋友下载。其它朋友推荐使用新版本。
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2016/6/28 17:32:43 |
12楼: |
一致很奇怪,这么明显的bug为何emb没改正呢?
----------------------------------------------
-
|
作者: |
|
2016/7/7 11:23:07 |
13楼: |
2016.7.7 ======== * 修正了 Delphi 的 iOS 实现的一处问题,详情参考:http://blog.qdac.cc/?p=4003
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
|
2016/7/19 14:38:17 |
14楼: |
2016.7.18 ========= * 修复了在特定场景下出现 AV 错误的问题
2016.7.19 ========= * 修正了特定场景下,调整焦点的位置过头的问题 * 修正了设置窗体的填充设置会失效的问题
至此,已知的问题全部修正,唯一不完美的地方就是需要单独引用这个单元,但这不是我能解决的问题,这个需要 Delphi 自己去做。
----------------------------------------------
QDAC 开源数据库访问组件欢迎大家关注讨论和使用 官网(博客):http://www.qdac.cc 讨论QQ群:250530692 QLang 多语言组件快速让你的程序走向海外
|
作者: |
bdl1 (bdl1) |
▲▲▲▲▲ |
-
|
普通会员 |
|
2016/7/19 21:34:24 |
15楼: |
太棒了!
----------------------------------------------
-我的博客
|
作者: |
akay (akay) |
★☆☆☆☆ |
-
|
普通会员 |
|
2016/7/20 9:48:15 |
16楼: |
谢谢分享!!
----------------------------------------------
-
|
作者: |
|
2020/7/30 3:58:28 |
17楼: |
请问为何在10.3.3下无法使用,错误提示如下: [DCC Error] qdac_fmx_vkhelper.pas(226): E2003 Undeclared identifier: 'ConvertPixelToPoint'
----------------------------------------------
-
|
作者: |
|
2020/9/18 15:35:35 |
18楼: |
@sailor77 去qdac官网下载qdac,里面有支持10.3.3的版本
----------------------------------------------
-
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2020/9/19 14:23:20 |
19楼: |
uses FMX.Platform.UI.Android; 加上这个就可以了。
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/8/28 8:35:09 |
20楼: |
这个不支持10.4.2,请大老提供一个支持10.4.2的版本。
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
zjcqg (chen) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/10/6 11:59:04 |
21楼: |
好象对10.4.1也没效果,请大侠增强10.4.1的版本
----------------------------------------------
-
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/10/6 17:48:34 |
22楼: |
D11也不行了。
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/10/18 10:20:12 |
23楼: |
在10.2中效果不赖,挺好 在10.42里无效果!!! Undeclared identifier: 'ConvertPixelToPoint'在10.42里uses FMX.Platform.UI.Android; 确实可以解决问题,但是虚拟键盘仍旧遮挡控件
也不知道什么时候可以支持10.42
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
zjcqg (chen) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/2/10 21:27:46 |
24楼: |
修改FMX.VirtualKeyboard.Android.pas,放在工程目录中代替,可以完美解决问题,在10.4.1,10.4.2,11中都可以完美
----------------------------------------------
-
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/2/13 8:47:54 |
25楼: |
@zjcqg (chen) 要修改那些地方?
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/2/23 23:03:28 |
26楼: |
期待10.4.2版本的, 官网打不开,无法下载,有下载好的吗?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
zjcqg (chen) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/2/28 20:51:34 |
27楼: |
25楼,上传针对delphi 10.4.1/10.4.2的,如果要用在delphi 11下,要把TVirtualKeyboardAndroid都改成TAndroidKeyboardVirtual,所以说delphi坑爹,改来改去.
----------------------------------------------
-
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/3/1 17:14:32 |
28楼: |
感谢 zjcqg (chen)
Delphi 10.4.2 我把FMX.VirtualKeyboard.Android.pas拷贝到了工程目录下,也uses qdac_fmx_vkhelper 可是,不知道哪里出了错,就是没有效果???
覆盖FMX.VirtualKeyboard.Android.pas需要覆盖几个地方呢?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
zjcqg (chen) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/3/9 20:09:11 |
29楼: |
28楼,不要用uses qdac_fmx_vkhelper(有冲突,不能用),直接把我上传的VirtualKeyboard.Android.pas复制到工程目录下就行,例如复制到官码..Samples\Object Pascal\Multi-Device Samples\User Interface\KeyboardTypes,你运行试试看
----------------------------------------------
-
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/3/21 0:42:26 |
30楼: |
zjcqg (chen): 覆盖替换了 C:\Program Files (x86)\Embarcadero\Studio\21.0\source\fmx下的VirtualKeyboard.Android.pas文件,在工程里remove了qdac_fmx_vkhelper,单元里uses里也移除了, 但是还是没有效果,依旧遮挡键盘,哈哈,感谢您再次赐教!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
zjcqg (chen) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/3/27 15:30:58 |
31楼: |
30楼,不用覆盖替换了源码,只要把我的那个VirtualKeyboard.Android.pas放有你的工程目录下就可以,DELPHI会优先用这个文件。也搞懂了,反正我在10。4。1都好用。
----------------------------------------------
-
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/4/4 15:22:58 |
32楼: |
D11中将:要把TVirtualKeyboardAndroid都改成TAndroidKeyboardVirtual,
编译的时候提示: [DCC Fatal Error] FMX.VirtualKeyboard.Android.pas(62): F2613 Unit 'FMX.Platform.Android' not found.
我检查了路径设置,里面包含了FMX.Platform.Android 所在的目录 RAD Studio 11.1\source\fmx
请问这是哪里出了问题?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/4/6 11:25:24 |
33楼: |
好吧,文件名称也需要改动。把文件名称改为:FMX.AndroidKeyboardVirtual.pas后编译没有问题了
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/4/24 15:25:12 |
34楼: |
@ sxfgf delphi113有效果吗?
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
sxfgf (FC_FGF) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/4/24 15:51:47 |
35楼: |
@ jingzu ,这个还真不清楚
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/4/25 7:55:14 |
36楼: |
@sxfgf 按你说的编译通过了,也能生成APK,但安装上手机上,没有效果,不知道问题出在那里?
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
jingzu (123456) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/4/25 10:20:54 |
37楼: |
@zjcqg (chen): D113编译通过,但没有效果,怎么使用?
----------------------------------------------
永远是DELPHI初学者。
|
作者: |
wfymqj (wfymqj) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/9/12 11:42:55 |
38楼: |
D11.3编译通过,确实没有效果
----------------------------------------------
-
|
作者: |
|
2023/9/12 23:11:36 |
39楼: |
D11.3已经不需要单独处理键盘上浮问题了。不知道是新版安卓解决的还是开发工具解决的。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
|
作者: |
wfymqj (wfymqj) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/9/13 9:00:22 |
40楼: |
@zyp1984 我用D11.3编译的APP,在安卓13和安卓10上运行,还是会出现输入焦点被虚拟键盘遮挡。请问你是怎么处理的?与布局有关吗?
----------------------------------------------
-
|
作者: |
wfymqj (wfymqj) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/9/13 13:20:45 |
41楼: |
今天我按D11.3官方Demo ScrollableForm中的方式操作了,可以基本达到效果。只是主动隐藏虚拟键盘时,没有复位而已
----------------------------------------------
-
|
作者: |
|
2024/1/6 21:25:08 |
42楼: |
D12不知该如何解决虚拟键盘隐藏时,应该要自动失焦并执行FormVirtualKeyboardHidden。替换了FMX.VirtualKeyboard.Android,或是uses了qdac_fmx_vkhelper都没有效果。
----------------------------------------------
-
|
|