android - 如何在 Android 上获取 InputMethod 的窗口
问题描述
为了在我们的应用程序上收集用户的击键特征,我必须在输入法视图(软键盘)上收集触摸事件(或只是点击时间戳)。
1)据我所知,软键盘的窗口与Activity的窗口是不同的
2)只要能拿到一个视图的窗口,就可以拦截这个窗口的触摸事件。
解决方案
据我所知,键盘窗口属于系统UI,如状态栏或通知窗口;一个普通的应用程序无法访问 Android 框架中的此类系统窗口。
但是你可以尝试一些棘手的事情来看看它是否能达到你的目的:当软键盘启动时,你可以计算它的高度,然后创建一个新的透明窗口,如 PopupWindow,覆盖键盘的高度相同。这样您就可以拦截键盘上的触摸事件而不会阻止它们。
=== 2018 年 12 月 21 日更新 ===
请注意,Android 中的所有窗口实际上都是以类似的方式在 ui 框架中实现的。即您的应用程序的应用程序窗口、输入法、状态栏、通知栏...都是窗口,每个窗口都有一个标志来指示窗口类型(请阅读此处)。简而言之,窗口类型将决定在屏幕上渲染时的窗口 z-index。它们被归类为Application Window
和。Sub-Window
System Window
话虽如此,PopupWindow 只是其中之一,它是 Android 系统提供的一个方便的帮助窗口(相对于 InputMethod 窗口的 z-index 较小)。只需尝试使用WindowManager.addView()
大于 InputMethod 窗口(可能带有 标志TYPE_INPUT_METHOD
)的窗口类型标志来创建您自己的窗口。
推荐阅读
- javascript - 使用 FetchAPI 时,隐式 OAuth 不会重定向或提供回调 url
- python - 升级到 django-1.11 后加载管理页面出错
- php - 使用样式表编辑脚本输出
- javascript - 通过 Twitter URL 共享内容不起作用
- selenium - WebDriver -- 找不到动态跨度属性
- java - 我可以使用弹簧注入来注入枚举吗?
- go - 在 Go 中分配大字符串的最快方法是什么?
- javascript - 如何使用 promise map 实现嵌套循环
- c++ - 为什么编译器找不到超类的方法?
- c++ - 使用 OpenCv 和 C++ 进行 Kinect V1 校准