Android的ListView源码中有三种onKey事件:onKeyDown、onKeyUp、onKeyMultiple,它们均通过commonKey方法处理。
commonKey方法中,又只对ACTION_DOWN覆写了本地处理,也即只对onKeyDown进行了额外处理。另外两个通过向上提交到父类的onKey方法中处理。
对于ListView,onKey事件调用路径按按键类型划分如下:
ACTION_DOWN:
KEYCODE_DPAD_CENTER、KEYCODE_ENTER、KEYCODE_SPACE:
onKeyDown(ListView.java) -> commonKey(ListView.java)
KEYCODE_DPAD_UP、KEYCODE_DPAD_DOWN、KEYCODE_DPAD_LEFT和KEYCODE_DPAD_RIGHT:
onKeyDown(ListView.java) -> commonKey(ListView.java)
KEYCODE_BACK :
onKeyDown(ListView.java) -> commonKey(ListView.java) ->sendToTextFilter(AbsListView.java) -> 根据返回值决定是否调用 onKeyDown(View.java) 【注: onKeyDown(View.java) 中没有对KEYCODE_BACK 的处理代码,因此将简单返回false】
ACTION_UP:
KEYCODE_DPAD_CENTER、KEYCODE_ENTER、KEYCODE_SPACE:
onKeyUp(ListView.java) -> commonKey(ListView.java) -> sendToTextFilter(AbsListView.java) 【注:简单返回false】-> onKeyUp(AbsListView.java) -> onKeyUp(View.java)
KEYCODE_DPAD_UP、KEYCODE_DPAD_DOWN、KEYCODE_DPAD_LEFT和KEYCODE_DPAD_RIGHT:
onKeyUp(ListView.java) -> commonKey(ListView.java) -> sendToTextFilter (AbsListView.java)【注:简单返回false】 -> onKeyUp(AbsListView.java) -> onKeyUp(View.java) 【注: onKeyUp(AbsListView.java) 和onKeyUp(View.java) 中没有对KEYCODE_DPAD_UP、KEYCODE_DPAD_DOWN、KEYCODE_DPAD_LEFT和KEYCODE_DPAD_RIGHT 的处理代码,因此将简单返回false】
KEYCODE_BACK :
onKeyUp(ListView.java) -> commonKey(ListView.java) ->sendToTextFilter(AbsListView.java) -> 根据返回值决定是否调用 onKeyUp(View.java) 【注: onKeyUp(View.java) 中没有对KEYCODE_BACK 的处理代码,因此将简单返回false】
ACTION_MULTIPLE:
ACTION_MULTIPLE是指多个连续的重复事件,可拆开为多个上面的ACTION_DOWN和ACTION_UP理解,此处从略。