| 知乎专栏 |
@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;
}