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

我创建延伸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事件。

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

有帮助吗?

解决方案

我发现我是返回的 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子类的构造。

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

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

我不知道为什么有时不工作,虽然我的应用程序之一这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;
}

我通过添加到构造该代码解决了这个:

setFocusable(true);
requestFocus();

感谢,齐尔扬

另外我每次使用setContentView(myView);我必须调用myView.requestFocus();时间。如果有更好的解决办法,请告诉我。

那么,在看API文档脱颖而出的唯一的事情是,在android:点击属性必须设置以及为中,onKeyDown(...)方法的工作要启用的视图

你可以试试这个

this.setFocusable(true);

您的活动可能是吃的关键事件。覆盖的onkeydown在活动,并在那里扔一个断点。

另外:当你说你已经“它放置在主窗体”您使用的是XML布局;或者在你的代码做

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top