知乎专栏 |
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { // 处理向上方向键的操作 } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { // 处理向下方向键的操作 } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { // 处理向左方向键的操作 } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { // 处理向右方向键的操作 } Log.d(TAG, "onKeyDown: " + keyCode + " KeyEvent: " + event.toString()); broadcastKeyboard(keyCode, event); return super.onKeyDown(keyCode, event); }
onKeyDown 只能回返 ACTION_DOWN
onKeyDown: 62 KeyEvent: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_SPACE, scanCode=57, metaState=0, flags=0x8, repeatCount=2726, eventTime=24657171386863, downTime=24518384382000, deviceId=59, source=0x101, displayId=-1 }
onKeyDown(int keyCode, KeyEvent event) 只能工作在 Activity 中,Fragment 也需要处理键盘时间,所以我用广播将键盘事件发送给 Fragment, broadcastKeyboard(keyCode, event);
public static void broadcastKeyboard(int keyCode, KeyEvent event) { Log.d(TAG, "onKeyDown: " + keyCode + " KeyEvent: " + event.toString()); Context context = MainApplication.getContext(); Intent intent = new Intent(); intent.setAction("keyboard.event"); intent.setPackage(context.getPackageName()); intent.putExtra("keyCode", keyCode); intent.putExtra("action", event.getAction()); context.sendBroadcast(intent); }
@Override public boolean dispatchKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); int action = event.getAction(); return handleKeyEvent(action, keyCode) || super.dispatchKeyEvent(event); } private boolean handleKeyEvent(int action, int keyCode) { if (action != KeyEvent.ACTION_DOWN) return false; switch (keyCode) { case KeyEvent.KEYCODE_ENTER: Log.d(TAG, "ENTER"); case KeyEvent.KEYCODE_DPAD_CENTER: //确定键enter Log.d(TAG, "CENTER"); break; case KeyEvent.KEYCODE_DPAD_DOWN: //向下键 Log.d(TAG, "DOWN"); break; case KeyEvent.KEYCODE_DPAD_UP: //向上键 Log.d(TAG, "UP"); break; case KeyEvent.KEYCODE_DPAD_LEFT: //向左键 Log.d(TAG, "LEFT"); break; case KeyEvent.KEYCODE_DPAD_RIGHT: //向右键 Log.d(TAG, "RIGHT"); break; default: Log.d(TAG, "Key code: " + keyCode); break; } return false; }
Home 键无法拦截
@Override public boolean dispatchKeyEvent(KeyEvent event) { Log.d(TAG, "dispatchKeyEvent: " + event.toString()); if (event.getKeyCode() == KeyEvent.KEYCODE_HOME) { Log.d(TAG, "Home disabled!"); return true; } return super.dispatchKeyEvent(event); }
KeyEvent.KEYCODE_BACK 键盘事件回让让App进入后台,返回安卓系统。我们不希望程序进入后台,加入如下代码。
@Override public void onBackPressed() { return; }