onKeyDown()问题

Nik*_*lin 13 android onkeydown android-view

我想创建一个照片/视频捕获应用程序.

我创建了一个CaptureView扩展SurfaceView并放在主窗体中的类.

主窗体的活动具有onCreateOptionsMenu()创建菜单的方法.菜单工作正常,但后来我尝试实现一个方法onKeyDown:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(event.getAction() == KeyEvent.ACTION_DOWN) {
        switch(keyCode) {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
        }
    }

    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

该菜单不再出现,并且该方法不会捕获onKeyDown事件.

有谁知道这个问题可能是什么原因?

Cir*_*yon 14

我遇到了类似的问题并通过添加来解决它

this.requestFocus();
this.setFocusableInTouchMode(true);
Run Code Online (Sandbox Code Playgroud)

在我的SurfaceView子类的构造函数中.


小智 12

我发现我正在true为所有事件返回,我应该只为我正在使用的代码返回它.我在if声明的范围内移动了返回true ,false否则返回了我的菜单了!

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        dba.close();
        Intent result = new Intent("Complete");
        setResult(Activity.RESULT_OK, result);
        finish();
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • -1.最好的答案是'return super.onKeyDown(keyCode,event);',而不是在你不处理密钥时总是返回false,如rrabio发布的那样. (7认同)

rra*_*bio 6

我解决了删除if语句,如下所示:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)