【问题标题】:How to get the Window of InputMethod on Android如何在 Android 上获取 InputMethod 的窗口
【发布时间】:2019-05-19 13:37:46
【问题描述】:

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

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

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

那么有没有办法获取软键盘的窗口呢?

【问题讨论】:

    标签: android window android-softkeyboard android-windowmanager android-input-method


    【解决方案1】:

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

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

    === 21/12/2018 更新 ===

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

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

    【讨论】:

    • 谢谢!但是我失败了……好像popupwindow在inputmethod窗口下面。
    • 也许您应该创建自己的窗口,而不是使用 Android 框架提供的 PopupWindow。我刚刚更新了答案供您参考。
    • 谢谢~看了一遍WindowManager.java的代码,发现有很多window types字段,如你所说,代表z-order,比如TYPE_INPUT_METHOD=FIRST_SYSTEM_WINDOW+11。但是FIRST_SYSTEM_WINDOW上面的所有类型需要特殊权限,除了 FloatingWindow 类型,TYPE_APPLICATION_OVERLAY=FIRST_SYSTEM_WINDOW+38(大于 TYPE_INPUT_METHOD)。所以问题就变成了,如何创建一个透明 FloatingWindow,它可以捕获 TouchEvents,但不会阻止事件的传播。跨度>
    • 你知道如何使透明窗口可触摸并且不会阻止事件的传播吗?~我不知道。谢谢~
    • 您尝试过 View.dispatchTouchEvent (developer.android.com/reference/android/view/…) 吗?或者您可以更详细地了解如何管理触摸事件:developer.android.com/training/gestures/viewgroup
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多