13

I would like to create a photo/video capture application.

I have created a CaptureView class which extends SurfaceView and placed it in the main form.

The main form's activity has onCreateOptionsMenu() method which creates a menu. The menu worked fine but then I tried to implement a method 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);
}

The menu doesn't appear anymore and the method doesn't catch onKeyDown event.

Does anyone know what could be the reason for this issue?

4

8 回答 8

14

我有一个类似的问题并通过添加解决了它

this.requestFocus();
this.setFocusableInTouchMode(true);

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

于 2009-11-30T10:15:17.323 回答
12

我发现我正在true为所有事件返回,而我应该只为我正在使用的代码返回它。if我将 return 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;
}
于 2009-09-13T14:02:08.537 回答
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);
}
于 2010-06-15T14:42:40.570 回答
4

我不知道为什么有时它不起作用,尽管对于我的一个应用程序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;
}
于 2012-06-15T08:15:51.273 回答
2

我通过将以下代码添加到构造函数中解决了这个问题:

setFocusable(true);
requestFocus();

谢谢,Ciryon

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

于 2012-02-14T14:18:39.173 回答
1

你可以试试这个

this.setFocusable(true);
于 2010-03-23T12:31:55.647 回答
1

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

于 2009-06-10T17:47:45.563 回答
0

您的活动可能正在吃关键事件。在活动中覆盖 onKeyDown 并在其中设置断点。

另外:当你说你“把它放在主窗体中”时,你是在使用 XML 布局还是在你的代码中做?

于 2009-06-10T19:41:46.533 回答