首页 > 解决方案 > 如何在 Android 上获取 InputMethod 的窗口

问题描述

为了在我们的应用程序上收集用户的击键特征,我必须在输入法视图(软键盘)上收集触摸事件(或只是点击时间戳)。

1)据我所知,软键盘的窗口与Activity的窗口是不同的

2)只要能拿到一个视图的窗口,就可以拦截这个窗口的触摸事件。

那么有没有办法获取软键盘的窗口呢? 在此处输入图像描述

标签: androidwindowandroid-softkeyboardandroid-windowmanagerandroid-input-method

解决方案


据我所知,键盘窗口属于系统UI,如状态栏或通知窗口;一个普通的应用程序无法访问 Android 框架中的此类系统窗口。

但是你可以尝试一些棘手的事情来看看它是否能达到你的目的:当软键盘启动时,你可以计算它的高度,然后创建一个新的透明窗口,如 PopupWindow,覆盖键盘的高度相同。这样您就可以拦截键盘上的触摸事件而不会阻止它们。

=== 2018 年 12 月 21 日更新 ===

请注意,Android 中的所有窗口实际上都是以类似的方式在 ui 框架中实现的。即您的应用程序的应用程序窗口、输入法、状态栏、通知栏...都是窗口,每个窗口都有一个标志来指示窗口类型(请阅读此处)。简而言之,窗口类型将决定在屏幕上渲染时的窗口 z-index。它们被归类为Application Window和。Sub-WindowSystem Window

话虽如此,PopupWindow 只是其中之一,它是 Android 系统提供的一个方便的帮助窗口(相对于 InputMethod 窗口的 z-index 较小)。只需尝试使用WindowManager.addView()大于 InputMethod 窗口(可能带有 标志TYPE_INPUT_METHOD)的窗口类型标志来创建您自己的窗口。


推荐阅读