Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

4.6. 键盘事件

4.6.1. onKeyDown 键盘按下事件

			
    @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);
    }
			
			

4.6.2. dispatchKeyEvent

			
	
			
			
			
    @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);
    }			
			
			

4.6.3. 屏蔽 KeyEvent.KEYCODE_BACK

KeyEvent.KEYCODE_BACK 键盘事件回让让App进入后台,返回安卓系统。我们不希望程序进入后台,加入如下代码。

		
    @Override
    public void onBackPressed() {
        return;
    }
		
			

4.6.4. 判断按下次数

			
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //按下的如果是BACK,同时没有重复
           Toast.makeText("test","KEYCODE_BACK",1).show();
            return true;
    }
       return super.onKeyDown(keyCode, event);
}