【发布时间】:2011-12-12 08:41:03
【问题描述】:
Android提供的onKey()、OnKeyDown()和dispatchKeyEvent()方法有什么区别?
我想知道这些可以在何时何地使用。
请对此有所了解。
【问题讨论】:
Android提供的onKey()、OnKeyDown()和dispatchKeyEvent()方法有什么区别?
我想知道这些可以在何时何地使用。
请对此有所了解。
【问题讨论】:
追踪5.1 Source for the View Class的源代码。 dispatchKeyEvent() 似乎是系统调用的第一个方法。重载它将阻止调用任何和所有关键事件,除非调用基本版本。
dispatchKeyEvent() 的第一步是尝试将事件传递给onKeyListener(如果有的话)。这是调用onKey() 的时间。如果onKey() 实现返回true,dispatchKeyEvent() 将返回那里并且不会调用其他事件。
如果没有onKeyListener或者onKeyListener的onKey()方法返回false,那么dispatchKeyEvent()就会调用KeyEvent的dispatch()方法。然后它将依次调用视图上KeyEvent.Callback 接口中的所有方法。这包括onKeyDown() 和onKeyUp()。
【讨论】:
dispatchKeyEvent,而不是同时使用onKeyDown 和onKeyUp?这有什么缺点吗?我必须这样做,因为出于某种原因,大多数键都不会触发onKeyDown。当我更改为dispatchKeyEvent 时,它起作用了。
dispatchKeyEvent 是一个选项。但除非您调用基本版本,否则不会触发其他相关事件。在您的情况下,我的猜测是您的事件在调用KeyEvent.dispatch() 之前被onKeyListener 消耗,或者按键被dispatch() 方法视为onKeyMultiple 事件。
DispatchKeyEvent 硬件关键事件总是传递给当前焦点所在的视图。它们从 View 层次结构的顶部开始调度,然后向下调度,直到它们到达适当的目的地。如果您的视图(或您的视图的子视图)当前具有焦点,那么您可以通过 dispatchKeyEvent() 方法看到事件的传播。简而言之,dispatchKeyEvent() 只有在 TextView/EditText 处于焦点时才会被调用。
onKeyDown当一个键被按下并且没有被活动内部的任何视图处理时调用
【讨论】: