在Android中,可以在他们到达具有焦点的子视图之前全局拦截关键事件吗?

Car*_*arl 12 keyboard events android key event-handling

在大多数情况下,我希望关键事件由目前具有焦点的(子)视图处理,这是默认行为,也是我目前已经实现的.

但是,在某些非常具体的情况下,我想暂时拦截和处理所有关键事件(包括那些通常由子视图处理的事件),或者在我当前的活动中,或者在我的根视图中失败,这是无关紧要的,只要它们在全球范围内处理 - 我不关心像音量+/-这样的硬件按钮,因为无论如何都不会在我的任何子视图中处理这些按钮).

对于触摸事件,我们有onInterceptTouchEvent(),它允许ViewGroup在调度到子视图时观察触摸事件,并阻止它们所针对的子视图接收这些事件(如果需要).

不幸的是,我找不到与onInterceptTouchEvent()类似的关键事件.我错过了一些明显的东西,或者这是操作系统中的实际不对称?

当然,我可以连接每个子视图的当前键事件处理程序代码,直接调用主活动上的方法来处理事件,如果它想要,并让该活动级方法返回一个布尔值,指示是否它处理了这个事件.然后,当且仅当它调用的活动方法没有处理它时,子视图才能处理该事件.

但我希望有一种更简洁的方法可以简单地拦截流向"层次"层次到子视图的流量,就像onInterceptTouchEvent()对触摸事件一样.

S.D*_*.D. 0

所有小部件/视图似乎都实现了KeyEvent.Callback,它具有调用按键、长按、多次和按键的方法。所有这些方法都返回布尔值,解释如下:

如果您处理了该事件,则返回 true。如果您希望允许下一个接收者处理该事件,请返回 false。

我认为您可以尝试在父组件中重写这些方法。

另一种是dispatchKeyEvent()View处理沿着焦点路径调度事件。也可以尝试覆盖这个。