在大多数情况下,我希望当前具有焦点的(子)视图处理关键事件,这是默认行为,也是我目前已经实现的。
但是,在某些非常具体的情况下,我想在我当前的活动中或者在我的根视图中临时拦截和处理所有关键事件(特别是那些通常由子视图处理的事件)(没关系,只要它们是全局处理的——我不关心音量 +/- 之类的硬件按钮,因为无论如何我的任何子视图都不会处理这些按钮)。
对于触摸事件,我们有 onInterceptTouchEvent(),它允许 ViewGroup 在触摸事件被分派到子视图时观察它们,并阻止它们预期的子视图接收这些事件(在需要时)。
不幸的是,对于关键事件,我找不到任何类似于 onInterceptTouchEvent() 的东西。我是否遗漏了一些明显的东西,或者这是操作系统中的实际不对称?
当然,我可以只连接每个子视图的当前键事件处理程序代码,以直接调用主活动上的方法来处理事件(如果需要),并让该活动级方法返回一个布尔值,指示它是否处理了事件。然后,当且仅当它调用的活动方法没有处理它时,子视图才能处理该事件。
但我希望有一种更简洁的方法来简单地拦截流量“向下”到子视图的层次结构,就像 onInterceptTouchEvent() 对触摸事件所做的那样。