Android onKeyDown()问题

Android onKeyDown()问题,android,android-view,onkeydown,Android,Android View,Onkeydown,我想创建一个照片/视频捕获应用程序 我创建了一个CaptureView类,该类扩展了SurfaceView,并将其放在主窗体中 主窗体的活动具有创建菜单的onCreateOptionsMenu()方法。菜单工作正常,但随后我尝试实现一种方法onKeyDown: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_DOWN) {

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

我创建了一个
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);
}
该菜单不再显示,并且该方法不会捕获onKeyDown事件


有人知道这个问题的原因吗?

好吧,在查看API文档时,唯一突出的是必须设置android:clickable属性以及启用视图,以便onKeyDown(…)方法工作。

您的活动可能正在吞噬关键事件。在活动中重写onKeyDown并在其中抛出断点


另外:当您说您已经“将其放置在主窗体中”时,您是在使用XML布局还是在代码中执行操作?

我发现我正在为所有事件返回
true
,而我本应该只为我正在使用的代码返回它。我将return true移动到
if
语句的范围内,并返回了
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;
}

我有一个类似的问题,通过添加

this.requestFocus();
this.setFocusableInTouchMode(true);
在我的SurfaceView子类的构造函数中。

你可以试试这个

this.setFocusable(true);

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

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

我通过在构造函数中添加以下代码来解决此问题:

setFocusable(true);
requestFocus();
谢谢


而且每次我使用
setContentView(myView)我必须调用
myView.requestFocus()。如果有更好的解决方案,请告诉我。

我不知道为什么有时它不起作用,但对于我的一个应用程序,这个
keyDown()
可以正常工作,当我将它用于新应用程序时,它也不起作用

但我有一个始终有效的解决方案:

@Override
public boolean dispatchKeyEvent (KeyEvent event) {
    if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
        Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
        return true;
    }
    return false;
}

如果您注释掉If语句,菜单是否仍然未显示?我尝试注释掉If语句,但正如预期的那样,没有任何更改。我刚刚发现有一些与停止执行上述代码无关的异常。谢谢,这对我很有效。我使用viewflipper在视图之间移动,并希望覆盖“后退”按钮以将视图设置为当前视图。向VF添加webview时,onKeyDown停止触发。在VF上设置requestFocus和setFocusableInTouchMode可以解决问题。再次谢谢你说得好。始终在末尾返回false对我来说很有用,但是当使用新的ICS SDK编译时,back键不再起作用,因为该事件现在似乎已在super.onKeyDownSorry始终返回false用于在旧SDK中工作,但会导致问题:当使用ICS编译时,此方法将禁用back键。当然,在您的具体情况下,它可以正常工作,因为您正在精确地使用back key事件,但通常情况下,它不会按预期工作。最好的答案是“返回super.onKeyDown(keyCode,event);”,不像rrabio发布的那样,当您不处理按键按下时总是返回false。当按下硬件搜索按钮时,根本不会调用onKeyDown()方法,而是触发搜索默认行为。但按下后退或菜单按钮会触发此方法。我怎样才能听到android硬件搜索按钮的点击。?